초안 ECMA-262 / 2025년 7월 24일
ECMAScript® 2026 언어 명세서
소개
이 Ecma 표준은 ECMAScript 2026 언어를 정의합니다. 이것은 ECMAScript 언어 명세의 열일곱 번째 에디션입니다. 1997년 첫 번째 에디션이 출판된 이후,
ECMAScript는 세계에서 가장 널리 사용되는 범용 프로그래밍 언어 중 하나로 성장했습니다. 주로 웹 브라우저에 내장된 언어로 잘 알려져 있지만, 서버 및 임베디드 애플리케이션에서도
널리 채택되었습니다.
ECMAScript는 여러 원천 기술을 기반으로 하며, 그 중 가장 잘 알려진 것은 JavaScript(넷스케이프)와 JScript(마이크로소프트)입니다. 이 언어는 넷스케이프의
Brendan Eich가 발명했으며, 처음으로 그 회사의 Navigator 2.0 브라우저에 등장했습니다. 이후 넷스케이프의 모든 브라우저와 마이크로소프트의 Internet
Explorer 3.0부터 모든 브라우저에 포함되었습니다.
ECMAScript 언어 명세의 개발은 1996년 11월에 시작되었습니다. 이 Ecma 표준의 첫 번째 에디션은 1997년 6월 Ecma 총회에서 채택되었습니다.
그 Ecma 표준은 ISO/IEC JTC 1에 신속 채택 절차 하에 제출되었으며, 1998년 4월 국제 표준 ISO/IEC 16262로 승인되었습니다. 1998년 6월 Ecma 총회에서
ISO/IEC 16262와 완전히 일치시키기 위해 ECMA-262 두 번째 에디션이 승인되었습니다. 첫 번째와 두 번째 에디션의 차이점은 편집상의 변경입니다.
표준의 세 번째 에디션에서는 강력한 정규식, 향상된 문자열 처리, 새로운 제어문, try/catch 예외 처리, 오류 정의 강화, 숫자 출력 포맷 및 향후 언어 성장에 대비한 사소한 변경이
도입되었습니다. ECMAScript 표준의 세 번째 에디션은 1999년 12월 Ecma 총회에서 채택되었으며, 2002년 6월 ISO/IEC 16262:2002로 출판되었습니다.
세 번째 에디션 출판 이후, ECMAScript는 월드와이드웹과 함께 엄청난 채택을 이루었으며, 사실상 모든 웹 브라우저에서 지원되는 프로그래밍 언어가 되었습니다. ECMAScript의 네
번째 에디션을 개발하기 위한 중요한 작업이 이루어졌으나, 그 작업은 완성되지 않았고 네 번째 에디션으로 출판되지 않았습니다. 다만 일부 내용은 여섯 번째 에디션 개발에 통합되었습니다.
ECMAScript의 다섯 번째 에디션(ECMA-262 5번째 에디션으로 출판됨)은 브라우저 구현에서 일반적으로 사용되는 언어 명세의 사실상 해석을 공식화하였고, 세
번째 에디션 출판 이후 등장한 새로운 기능 지원을 추가했습니다. 이러한 기능에는 접근자 속성 , 객체의 반영적 생성 및 검사, 속성 특성의 프로그램 제어, 추가 배열 조작 함수,
JSON 객체 인코딩 포맷 지원, 그리고 향상된 오류 검사와 프로그램 보안을 제공하는 엄격 모드가 포함됩니다. 다섯 번째 에디션은 2009년 12월 Ecma 총회에서 채택되었습니다.
다섯 번째 에디션은 신속 채택 절차에 따라 ISO/IEC JTC 1에 제출되어 국제 표준 ISO/IEC 16262:2011로 승인되었습니다. ECMAScript 표준의 5.1 에디션은
사소한 수정이 반영되었으며 ISO/IEC 16262:2011과 동일한 텍스트입니다. 5.1 에디션은 2011년 6월 Ecma 총회에서 채택되었습니다.
여섯 번째 에디션의 집중 개발은 2009년에 시작되었으며, 다섯 번째 에디션이 출판 준비 중이었습니다. 하지만 그 이전에도 1999년 세 번째 에디션 출판 이후 상당한 실험과 언어 개선
디자인 작업이 이루어졌습니다. 실제로 여섯 번째 에디션의 완성은 15년간의 노력의 결실입니다. 이 에디션의 목표는 대규모 애플리케이션, 라이브러리 제작, 그리고 ECMAScript를 다른
언어의 컴파일 타겟으로 사용하는 데 더 나은 지원을 제공하는 것이었습니다. 주요 개선사항에는 모듈, 클래스 선언, 렉시컬 블록 스코프, 이터레이터 와 제너레이터, 비동기 프로그래밍을 위한 프라미스, 구조 분해 패턴, 적절한 꼬리
호출이 포함되었습니다. ECMAScript 내장 라이브러리는 맵, 셋, 2진 숫자 값 배열 등의 추가 데이터 추상화 지원과 문자열 및 정규식에서 유니코드 보충 문자 추가 지원을 포함하여
더욱 확장되었습니다. 내장 객체는 서브클래싱을 통해 확장 가능해졌습니다. 여섯 번째 에디션은 정기적이고 점진적인 언어 및 라이브러리 개선의 토대를 제공합니다. 여섯 번째 에디션은
2015년 6월 총회에서 채택되었습니다.
ECMAScript 2016은 Ecma TC39의 새로운 연간 릴리즈 주기와 공개 개발 프로세스 하에서 릴리즈된 첫 번째 ECMAScript 에디션입니다. 텍스트 소스 문서는
ECMAScript 2015 소스에서 제작되어 GitHub에서 추가 개발의 기반이 되었습니다. 표준 개발 기간 동안 수백 개의 풀 리퀘스트와 이슈가 제출되어 수천 건의 버그 수정, 편집
개선 및 기타 향상 작업이 이루어졌습니다. 또한 Ecmarkup, Ecmarkdown, Grammarkdown 등 여러 소프트웨어 도구가 개발되었습니다. ES2016에는 새로운 거듭제곱
연산자와 Array.prototype에 includes 메서드가 추가되었습니다.
ECMAScript 2017은 Async 함수, 공유 메모리, Atomics, 그리고 더 작은 언어 및 라이브러리 개선, 버그 수정, 편집 업데이트를 도입했습니다. Async 함수는
프라미스를 반환하는 함수에 대한 문법을 제공하여 비동기 프로그래밍 경험을 향상시킵니다. 공유 메모리와 Atomics는 병렬 CPU에서도 명확한 실행 순서를 보장하는 원자적 연산을 사용하여
다중 에이전트 프로그램이 통신할 수 있는 새로운
메모리 모델 을
도입했습니다. 또한 객체에 대한 새로운 정적 메서드인 Object.values, Object.entries,
Object.getOwnPropertyDescriptors도 포함되었습니다.
ECMAScript 2018은 비동기 이터레이터 프로토콜과 async 제너레이터를 통해 비동기 반복 지원을
도입했습니다. 또한 네 가지 새로운 정규식 기능(dotAll 플래그, 명명된 캡처 그룹, 유니코드 속성 이스케이프, 그리고 look-behind 어설션)과 객체의 rest 및 spread
속성을 추가했습니다.
ECMAScript 2019는 Array.prototype의 flat 및 flatMap 함수를 통한 배열 평탄화,
Object.entries의 반환값을 새 객체로 바로 변환하는 Object.fromEntries, 더 나은 이름의
String.prototype.trimStart 및 trimEnd 내장 함수(기존 비표준 trimLeft,
trimRight 대체용) 등 몇 가지 새로운 내장 함수를 도입했습니다. 또한 문법 및 의미론에 대한 소규모 업데이트(선택적 catch 바인딩 파라미터, JSON과
일치시키기 위해 문자열 리터럴에서 U+2028 및 U+2029 허용 등)가 포함되었습니다. 기타 업데이트에는 Array.prototype.sort의 안정적 정렬
요구, JSON.stringify의 입력에 상관없이 올바른 UTF-8 반환 요구, Function.prototype.toString의
명확화(원본 소스 텍스트 또는 표준 플레이스홀더 반환 요구)가 있습니다.
ECMAScript 2020, 11번째 에디션은 문자열의 matchAll 메서드(글로벌 정규식으로 생성된 모든 매치 객체에 대한 이터레이터
생성), import() 문법(동적 지정자로 모듈을 비동기적으로 import), BigInt(임의 정밀도의 정수 를 다루는 새로운 숫자 원시 타입),
Promise.allSettled(짧은 회로 없음), globalThis(글로벌 this 값 접근의 범용 방법),
모듈 내 export * as ns from 'module' 문법, for-in 열거 순서의 표준화 강화, 모듈 내에서 컨텍스트 정보를 담을
수 있는 import.meta 객체, nullish 값(undefined 또는 null )을
다루기 위한 새로운 문법(nullish 병합 연산자, 옵셔널 체이닝 연산자) 등을 도입했습니다.
ECMAScript 2021, 12번째 에디션은 문자열의 replaceAll 메서드, Promise.any(입력값이
fulfill될 때 짧은 회로), AggregateError(여러 오류를 한 번에 표현하는 새로운 오류 타입), 논리 할당 연산자(??=,
&&=, ||=), WeakRef(가비지 컬렉션에서 객체를 보존하지 않고 참조),
FinalizationRegistry(가비지 컬렉션 시 정리 작업 등록 및 해제 관리), 숫자 리터럴 구분자(1_000),
Array.prototype.sort의 구현 정의 정렬 순서 정렬 순서 의 경우 감소 등 다양한 기능을 도입했습니다.
ECMAScript 2022, 13번째 에디션은 모듈의 최상위에서 await 사용을 허용하는 기능, 클래스 내의 새로운 요소(퍼블릭 및 프라이빗
인스턴스 필드, 퍼블릭 및 프라이빗 정적 필드, 프라이빗 인스턴스 메서드 및 접근자, 프라이빗 정적 메서드 및 접근자), 클래스 내 정적 블록(클래스별 평가 초기화 수행),
#x in obj 문법(객체에 프라이빗 필드 존재 여부 테스트), /d 플래그(정규식 매치 인덱스 제공), Error
객체의 cause 속성(에러의 원인 연쇄 기록), 문자열, 배열, TypedArray 의 at 메서드(상대 인덱싱 지원),
Object.hasOwn(Object.prototype.hasOwnProperty의 편리한 대안) 등을 도입했습니다.
ECMAScript 2023, 14번째 에디션은 Array.prototype 및 TypedArray.prototype에
toSorted, toReversed, with, findLast,
findLastIndex 메서드, Array.prototype의 toSpliced 메서드, 파일 시작 부분에
#! 주석 지원(실행 가능한 ECMAScript 파일 지원 향상), 대부분의 심볼을 weak 컬렉션의 키로 사용 가능 등 기능을 도입했습니다.
ECMAScript 2024, 15번째 에디션은 ArrayBuffer 및 SharedArrayBuffer의 리사이즈 및 전송 기능, 문자열 집합 작업을 위한 고급 기능의
새로운 RegExp /v 플래그, Promise 생성 편의 메서드 Promise.withResolvers, 데이터 집계용
Object.groupBy 및 Map.groupBy 메서드, 공유 메모리 변경을 비동기적으로 대기하는
Atomics.waitAsync 메서드, 문자열의 올바른 유니코드만 포함되는지 검사 및 보장하는
String.prototype.isWellFormed 및 String.prototype.toWellFormed 메서드 등을 도입했습니다.
ECMAScript 2025, 16번째 에디션은 이터레이터 작업을 위한 새로운 Iterator 글로벌과 관련 정적
및 프로토타입 메서드, Set.prototype의 일반적 셋 연산 메서드, JSON 모듈 import 및 import된 모듈의 속성 선언 문법, 정규식 내 안전한
문자열 사용을 위한 RegExp.escape 메서드, 정규식 내에서 인라인으로 modifier 플래그 활성/비활성화 문법, 함수의 반환값이 프라미스일 수도 아닐
수도 있을 때 항상 프라미스로 반환하는 Promise.try 메서드, 새로운 Float16Array TypedArray 종류와 관련
DataView.prototype.getFloat16, DataView.prototype.setFloat16,
Math.f16round 메서드를 도입했습니다.
Ecma TC39 내에서 많은 조직을 대표하는 수십 명의 개인이 이 에디션과 이전 에디션의 개발에 매우 중요한 기여를 했습니다. 또한 TC39의 ECMAScript 작업을 지원하는 활발한
커뮤니티가 생겨났습니다. 이 커뮤니티는 수많은 초안 검토, 수천 건의 버그 리포트 제출, 구현 실험, 테스트 스위트 기여, ECMAScript에 대한 전 세계 개발자 교육 등 다양한
활동을 했습니다. 모든 기여자와 조직을 식별하고 인정하는 것은 불가능합니다.
Allen Wirfs-Brock
ECMA-262, 프로젝트 에디터, 6번째 에디션
Brian Terlson
ECMA-262, 프로젝트 에디터, 7번째 ~ 10번째 에디션
Jordan Harband
ECMA-262, 프로젝트 에디터, 10번째 ~ 12번째 에디션
Shu-yu Guo
ECMA-262, 프로젝트 에디터, 12번째 ~ 16번째 에디션
Michael Ficarra
ECMA-262, 프로젝트 에디터, 12번째 ~ 16번째 에디션
Kevin Gibbons
ECMA-262, 프로젝트 에디터, 12번째 ~ 16번째 에디션
1 범위
이 표준은 ECMAScript 2026 범용 프로그래밍 언어를 정의합니다.
2 준수
ECMAScript의 준수 구현체는 이 명세서에 기술된 모든 타입, 값, 객체, 프로퍼티, 함수, 프로그램 구문 및 의미론을 제공하고 지원해야 합니다.
ECMAScript의 준수 구현체는 소스 텍스트 입력을 최신 버전의 유니코드 표준 및 ISO/IEC 10646에 따라 해석해야 합니다.
다양한 인간 언어와 국가에서 사용되는 언어적, 문화적 관습에 적응이 필요한 프로그램을 지원하는 API를 제공하는 ECMAScript의 준수 구현체는 이 명세서와 호환되는 ECMA-402의
최신판에서 정의된 인터페이스를 구현해야 합니다.
ECMAScript의 준수 구현체는 이 명세서에 기술된 것 이외의 추가 타입, 값, 객체, 프로퍼티, 함수 등을 제공할 수 있습니다. 특히, 준수 구현체는 명세서에 기술되지 않은 프로퍼티와
그 값, 그리고 명세서에 기술된 객체에 대해 추가 프로퍼티를 제공할 수 있습니다.
ECMAScript의 준수 구현체는 이 명세서에 기술되지 않은 프로그램 및 정규식 구문을 지원할 수 있습니다. 특히, 준수 구현체는 이 명세서의 예약어 로 지정된 “미래 12.7.2 ”를 사용하는 프로그램 구문을 지원할 수 있습니다.
ECMAScript의 준수 구현체는 17.1 절에서 금지 확장으로 명시된 어떤 확장도 구현해서는 안 됩니다.
ECMAScript의 준수 구현체는 구현 정의 , 구현
근사 , 또는 호스트
정의 가 아닌 어떤 기능도 재정의해서는 안 됩니다.
ECMAScript의 준수 구현체는 규범적 선택 사항 절을 구현할지 말지 선택할 수 있습니다. 어떤 규범적 선택 사항 동작을 구현하는 경우,
해당 규범적 선택 사항 절의 모든 동작을 구현해야 합니다. 규범적 선택 사항 절은 아래와 같이 색상 박스에 “Normative Optional”이라는 단어로 표시됩니다.
2.1 규범적 선택 사항 절 제목 예시
절 내용 예시.
ECMAScript의 준수 구현체는 규범적 선택 사항으로도 표시되지 않는 레거시 절을 반드시 구현해야 합니다. 레거시 절 내에 명시된 모든 언어
기능과 동작은 하나 이상의 바람직하지 않은 특성을 가지고 있습니다. 그러나 기존 애플리케이션에서 계속 사용되고 있기 때문에 이 명세서에서 제거할 수 없습니다. 이러한 기능은
ECMAScript 언어의 핵심에 해당하지 않습니다. 새로운 ECMAScript 코드를 작성할 때 프로그래머는 이러한 기능과 동작을 사용하거나 존재를 가정해서는 안 됩니다.
2.2 레거시 절 제목 예시
절 내용 예시.
2.3 레거시 규범적 선택 사항 절 제목 예시
절 내용 예시.
3 규범적 참고문헌
다음에 참조된 문서는 이 문서의 적용에 필수적입니다. 날짜가 명시된 참고문헌의 경우, 인용된 판만 적용됩니다. 날짜가 명시되지 않은 참고문헌의 경우, 해당 문서의 최신판(모든 개정 포함)이
적용됩니다.
IEEE
754-2019 , IEEE 부동소수점 산술 표준 .
유니코드 표준.
https://unicode.org/versions/latest
ISO/IEC 10646, 정보 기술 — 범용 다중-옥텟 인코딩 문자 집합(UCS) 및 Amendment 1:2005, Amendment 2:2006, Amendment
3:2008, Amendment 4:2008, 그리고 추가 개정 및 정오표, 또는 후속판.
ECMA-402, ECMAScript 국제화 API 명세 , 특히 이 명세의 해당 연도판.
https://www.ecma-international.org/publications-and-standards/standards/ecma-402/
ECMA-404, JSON 데이터 교환 포맷 .
https://www.ecma-international.org/publications-and-standards/standards/ecma-404/
4 개요
이 절은 ECMAScript 언어에 대한 비규범적 개요를 포함합니다.
ECMAScript는 호스트
환경 내에서 계산을 수행하고 계산 객체를 조작하기 위한 객체 지향 프로그래밍 언어입니다. 여기서 정의된 ECMAScript는 계산적으로
자급자족하는 것을 목표로 하지 않습니다. 실제로, 이 명세에는 외부 데이터 입력이나 계산 결과 출력을 위한 규정이 없습니다. 대신, ECMAScript 프로그램의 계산 환경은 이 명세에
설명된 객체 및 기타 기능뿐만 아니라, 환경별 객체도 제공할 것으로 예상되며, 이러한 객체의 설명과 동작은 이 명세의 범위를 벗어나지만 특정 속성에 접근하거나 ECMAScript
프로그램에서 호출할 수 있는 함수가 있을 수 있음을 나타냅니다.
ECMAScript는 원래 스크립트 언어로 설계되었으나, 현재는 범용 프로그래밍 언어로 널리 사용되고 있습니다. 스크립트 언어 는 기존 시스템의 기능을 조작, 사용자화,
자동화하는 데 사용되는 프로그래밍 언어입니다. 이러한 시스템에서는 이미 유용한 기능이 사용자 인터페이스를 통해 제공되고, 스크립트 언어는 해당 기능을 프로그램 제어로 노출하는 수단입니다.
이렇게 기존 시스템이 호스트
환경 의 객체와 기능을 제공하여 스크립트 언어의 역량을 완성합니다. 스크립트 언어는 전문가와 비전문가 모두 사용할 수 있도록 설계되었습니다.
ECMAScript는 원래 웹 스크립트 언어 로 설계되어 브라우저에서 웹 페이지에 생동감을 부여하거나 웹 기반 클라이언트-서버 구조에서 서버 계산을 수행하는 메커니즘을
제공했습니다. ECMAScript는 이제 다양한 호스트 환경 에서 핵심 스크립트 기능을 제공합니다. 따라서 핵심 언어는 특정 호스트 환경 과 별도로 이
문서에서 명세됩니다.
ECMAScript의 사용은 단순 스크립트에서 벗어나 현재는 여러 환경과 규모에서 모든 프로그래밍 작업에 사용됩니다. ECMAScript의 사용이 확장됨에 따라 제공하는 기능과 설비도
확장되었습니다. ECMAScript는 이제 완전한 범용 프로그래밍 언어입니다.
4.1 웹 스크립팅
웹 브라우저는 클라이언트 측 계산을 위한 ECMAScript 호스트 환경 을 제공합니다. 여기에는 예를 들어, 창, 메뉴, 팝업, 대화 상자, 텍스트 영역,
앵커, 프레임, 히스토리, 쿠키, 입출력을 나타내는 객체 등이 포함됩니다. 또한 호스트 환경 은 포커스 변경, 페이지 및 이미지 로딩, 언로드, 오류 및 중단, 선택, 폼
제출, 마우스 동작 등 이벤트에 스크립트 코드를 연결하는 방법을 제공합니다. 스크립트 코드는 HTML 내에 나타나며, 표시되는 페이지는 사용자 인터페이스 요소와 고정 및 계산된
텍스트 및 이미지의 조합입니다. 스크립트 코드는 사용자 상호작용에 반응하며, 메인 프로그램이 필요하지 않습니다.
웹 서버는 요청, 클라이언트, 파일을 나타내는 객체, 데이터 잠금 및 공유 메커니즘 등 서버 측 계산을 위한 별도의 호스트 환경 을 제공합니다. 브라우저 측과 서버 측 스크립팅을 함께
사용하면, 사용자 맞춤형 웹 애플리케이션에서 클라이언트와 서버 간에 계산을 분산시킬 수 있습니다.
ECMAScript를 지원하는 각 웹 브라우저와 서버는 자체 호스트 환경 을 제공하여 ECMAScript 실행 환경을 완성합니다.
4.2 호스트와 구현체
호스트 환경 에
ECMAScript 통합을 돕기 위해, 이 명세는 특정 기능(예: 추상 연산 )의
정의를 전체 또는 일부 외부 소스에 위임합니다. 편집상, 이 명세는 다음과 같은 위임 유형을 구분합니다.
구현체 는 부록 D 에 열거된 기능이나 구현
정의 또는 구현 근사 로 표시된 기능을 외부에서 추가 정의하는 소스입니다.
비공식적으로, 구현체는 특정 웹 브라우저와 같은 구체적인 산출물을 의미합니다.
구현 정의 기능은 추가적인 자격 없이 정의를 외부 소스에 위임하는 기능입니다. 이
명세는 특정 동작에 대한 권고를 하지 않으며, 준수 구현체는 이 명세가 제시하는 제약 내에서 어떤 동작이든 자유롭게 선택할 수 있습니다.
구현 근사 기능은 이상적인 동작을 권고하면서 정의를 외부 소스에 위임하는
기능입니다. 준수 구현체는 이 명세가 제시하는 제약 내에서 어떤 동작이든 자유롭게 선택할 수 있지만, 이상적인 동작에 근접하도록 노력해야 합니다. Math.exp 와
같은 일부 수학 연산은 구현 근사 에 해당합니다.
호스트 는 부록 D 에 열거된 기능을 추가 정의하지만, 그 외의 구현
정의 또는 구현 근사 기능은 추가 정의하지 않는 외부 소스입니다. 비공식적으로,
호스트 는 부록 D 를 통해 이 명세와 같은 방식으로 연결되는 모든 구현체 집합(모든 웹 브라우저
집합 등)을 의미합니다. 호스트 는 종종 WHATWG
HTML(https://html.spec.whatwg.org/ )과 같은 외부 명세입니다. 즉,
호스트 정의 기능은 종종
외부 명세에서 추가로 정의됩니다.
호스트 후크 는 전체 또는 일부가 외부 소스에 의해 정의되는 추상
연산입니다. 모든 호스트 후크 는 부록
D 에 나열되어야 합니다. 호스트 후크 는 최소한 다음 요구사항을 충족해야 합니다:
호스트 정의 기능은 추가적인 자격 없이 정의를 외부 소스에 위임하며, 부록 D 에 나열되어야 합니다. 호스트 가 아닌 구현체도 호스트 정의 기능에 대한 정의를 제공할 수 있습니다.
호스트 환경 은 모든 호스트 정의 기능에 대한 구체적 정의
선택입니다. 호스트
환경 에는 일반적으로 호스트 정의 속성으로 입력을 얻거나 출력을 제공하는 객체 또는 함수가 포함되고, 이는
글로벌
객체 에 속합니다.
이 명세는 항상 가장 구체적인 용어를 사용하는 편집 관례를 따릅니다. 예를 들어, 어떤 기능이 호스트 정의 라면, 구현 정의 로 언급해서는 안 됩니다.
호스트 와 구현체 모두 이 명세가 정의한 언어 타입, 명세
타입, 추상 연산 , 문법 생성규칙, 내장 객체,
내장 심볼을 통해 이 명세와 인터페이스할 수 있습니다.
4.3 ECMAScript 개요
다음은 ECMAScript에 대한 비공식적 개요입니다. 언어의 모든 부분이 설명된 것은 아니며, 이 개요는 표준의 일부가 아닙니다.
ECMAScript는 객체 기반입니다. 기본 언어 및 호스트 기능이 객체로 제공되며, ECMAScript 프로그램은 서로 통신하는 객체 집합입니다.
ECMAScript에서 객체 는 0개 이상의 프로퍼티 로 이루어진 컬렉션이며, 각 프로퍼티는 해당 프로퍼티의 사용 방식을 결정하는
속성 을 가집니다. 예를 들어, 프로퍼티의 Writable 속성이 false 로 설정된 경우, ECMAScript 코드가 해당
프로퍼티에 다른 값을 할당하려는 모든 시도는 실패합니다. 프로퍼티는 다른 객체, 프리미티브 값 , 또는 함수 를 저장하는 컨테이너입니다. 프리미티브
값은 다음 내장 타입 중 하나에 속합니다: Undefined , Null , Boolean , Number , BigInt ,
String , Symbol ; 객체는 내장 타입 Object 에 속하며, 함수는 호출 가능한 객체입니다. 객체에 프로퍼티로 연결된 함수를
메서드 라고 합니다.
ECMAScript는 ECMAScript 엔티티 정의를 완성하는 내장 객체 집합도 정의합니다. 이러한 내장 객체에는 글로벌 객체 , 언어의
런타임
의미론 에 기본적인 객체들(Object, Function, Boolean, Symbol, 다양한 Error 객체), 숫자 값을 나타내고
조작하는 객체들(Math, Number, Date), 텍스트 처리 객체(String, RegExp), 값이 인덱스된 컬렉션(Array 및 9종의 Typed Array), 키 기반
컬렉션(Map, Set 객체), 구조화된 데이터 지원(JSON 객체, ArrayBuffer, SharedArrayBuffer, DataView), 제어 추상화를 지원하는
객체(제너레이터 함수, Promise 객체), 그리고 반영 객체(Proxy, Reflect)가 포함됩니다.
ECMAScript는 내장 연산자 집합도 정의합니다. ECMAScript 연산자에는 다양한 단항 연산, 곱셈 연산자, 덧셈 연산자, 비트 시프트 연산자, 관계
연산자, 동등성 연산자, 이진 비트 연산자, 이진 논리 연산자, 할당 연산자, 쉼표 연산자가 포함됩니다.
대규모 ECMAScript 프로그램은 모듈 을 통해 지원되며, 프로그램을 여러 문(statement) 및 선언(declaration) 시퀀스로 분할할 수 있습니다. 각
모듈은 다른 모듈에서 제공되어야 할 선언과, 다른 모듈에서 사용할 수 있는 자신의 선언을 명시적으로 식별합니다.
ECMAScript 문법은 의도적으로 Java 문법과 유사하게 설계되었습니다. ECMAScript 문법은 쉽게 사용할 수 있는 스크립트 언어가 되도록 완화되어 있습니다. 예를 들어,
변수는 타입 선언이 필요하지 않으며, 프로퍼티에 타입이 연결되지 않고, 정의된 함수도 호출보다 먼저 선언될 필요가 없습니다.
4.3.1 객체
ECMAScript에는 클래스 정의 구문이 포함되어 있지만, ECMAScript 객체는 C++, Smalltalk, Java와 같은 언어의 객체처럼 근본적으로 클래스 기반이
아닙니다. 대신, 객체는 리터럴 표기법이나 생성자 를 통해 여러 방식으로 생성될 수 있으며, 생성자는 객체를 생성한 후 초기
값을 프로퍼티에 할당하여 객체 전체 또는 일부를 초기화하는 코드를 실행합니다. 각 생성자 는 "prototype" 이라는 프로퍼티를 가지는 함수로,
프로토타입 기반 상속 및 공유 프로퍼티 를 구현합니다. 객체는 new 표현식에서 생성자 를 사용하여 생성됩니다. 예를
들어, new Date(2009, 11)은 새로운 Date 객체를 생성합니다. new 없이 생성자 를 호출하면, 그 결과는
생성자 에 따라 다릅니다.
예를 들어, Date()는 객체가 아니라 현재 날짜와 시간의 문자열 표현을 반환합니다.
생성자 로 생성된 모든
객체는 암시적 참조(객체의 프로토타입 이라 함)를 가지며, 이는 해당 생성자 의 "prototype" 프로퍼티 값입니다. 또한,
프로토타입은 자신의 프로토타입에 대한 null 이 아닌 암시적 참조를 가질 수 있습니다. 이를 프로토타입 체인 이라고 합니다.
객체의 프로퍼티에 대한 참조가 이루어지면, 해당 참조는 프로토타입 체인에서 그 이름의 프로퍼티를 가진 첫 번째 객체의 프로퍼티에 대한 참조입니다. 즉, 먼저 직접 언급된
객체에서 프로퍼티를 찾고, 해당 객체에 프로퍼티가 있으면 그 프로퍼티를 참조하며, 없다면 그 객체의 프로토타입을 다음으로 검사합니다.
그림 1: 객체/프로토타입 관계
클래스 기반 객체 지향 언어에서는 일반적으로 상태는 인스턴스가, 메서드는 클래스가 가지며, 상속은 구조와 동작에만 적용됩니다. ECMAScript에서는 상태와 메서드가 객체에
포함되며, 구조, 동작, 상태 모두 상속됩니다.
프로토타입에 특정 프로퍼티가 있지만 직접 해당 프로퍼티를 가지지 않는 모든 객체는 그 프로퍼티와 값을 공유합니다. 그림 1은 이를 보여줍니다:
CF 는 생성자 (그리고 객체)입니다. new 표현식을 통해 5개 객체가 생성되었습니다:
cf1 ,
cf2 , cf3 , cf4 , cf5 .
각 객체는 "q1" 및 "q2" 라는 프로퍼티를 가집니다. 점선은 암시적 프로토타입 관계를 나타냅니다.
예를 들어, cf3 의 프로토타입은 CFp 입니다. 생성자 CF 는 두 개의
프로퍼티("P1" , "P2" )를 가지지만, CFp ,
cf1 , cf2 , cf3 , cf4 ,
cf5 에서는 볼 수 없습니다. CFp 의 "CFP1" 프로퍼티는
cf1 , cf2 , cf3 , cf4 ,
cf5 에서 공유되며(CF 에서는 공유되지 않음), CFp 의 암시적 프로토타입 체인에서
"q1" , "q2" , "CFP1" 이 아닌 다른 프로퍼티도 마찬가지로
공유됩니다. CF 와 CFp 사이에는 암시적 프로토타입 링크가 없습니다.
대부분의 클래스 기반 객체 언어와 달리, 객체에는 값을 할당하여 동적으로 프로퍼티를 추가할 수 있습니다. 즉, 생성자 는 생성된 객체의 모든 프로퍼티를 반드시 명명하거나 값을 할당할
필요가 없습니다. 위 다이어그램에서 cf1 , cf2 , cf3 ,
cf4 , cf5 에 대해 CFp 에 새 값을 할당하여 새로운 공유 프로퍼티를
추가할 수 있습니다.
ECMAScript 객체는 본질적으로 클래스 기반은 아니지만, 공통된 생성자 함수, 프로토타입 객체, 메서드 패턴에 기반하여 클래스와 유사한 추상화를 정의하는 것이
편리한 경우가 많습니다. ECMAScript 내장 객체 자체도 이러한 클래스와 유사한 패턴을 따릅니다. ECMAScript 2015부터 ECMAScript 언어에는 내장
객체가 사용하는 클래스와 유사한 추상화 패턴에 맞는 객체를 간결하게 정의할 수 있는 문법적 클래스 정의가 포함되어 있습니다.
4.3.2 ECMAScript의 엄격 변형(strict variant)
ECMAScript 언어는 일부 사용자가 언어의 일부 기능 사용을 제한하고자 할 수도 있음을 인식합니다. 이는 보안, 오류 발생 가능성이 높은 기능 회피, 향상된 오류 검사,
기타 이유 등으로 이루어질 수 있습니다. 이를 지원하기 위해, ECMAScript는 엄격 변형(strict variant)을 정의합니다. 엄격 변형은 일반
ECMAScript 언어의 일부 구문적·의미론적 기능을 제외하고, 일부 기능의 상세 의미론을 수정합니다. 엄격 변형에서는 비엄격(non-strict) 언어 형태에서는 오류로
지정되지 않은 상황에서도 오류 예외를 던져야 하는 추가 오류 조건도 지정합니다.
ECMAScript의 엄격 변형은 일반적으로 언어의 엄격 모드(strict mode) 라고 불립니다. 엄격 모드 선택 및 엄격 모드 구문과 의미론 사용은
ECMAScript 소스
텍스트 단위 수준에서 명시적으로 이루어지며, 이는 11.2.2 에서 설명되어 있습니다. 엄격 모드는 구문 소스
텍스트 단위 수준에서 선택되므로, 엄격 모드는 해당 소스 텍스트 단위 내에서만 국지적으로 적용되는 제한을 부과합니다. 엄격 모드는 여러 소스 텍스트 단위에 걸쳐 일관되게
동작해야 하는 ECMAScript 의미론의 어떤 측면도 제한하거나 수정하지 않습니다. 완전한 ECMAScript 프로그램은 엄격 모드 및 비엄격 모드 ECMAScript 소스
텍스트 단위를 모두 포함할 수 있습니다. 이 경우, 실제로 엄격 모드 소스 텍스트 단위 내에서 정의된 코드를 실행할 때만 엄격
모드가 적용됩니다.
이 명세를 준수하려면, ECMAScript 구현체는 이 명세에서 정의된 전체 제한 없는 ECMAScript 언어와 엄격 변형 ECMAScript 언어를 모두 구현해야 합니다.
또한, 구현체는 제한 없는 소스 텍스트 단위와 엄격 모드 소스 텍스트 단위를 하나의 복합 프로그램으로 결합하는 것도 지원해야 합니다.
4.4 용어 및 정의
이 문서의 목적상, 다음 용어와 정의가 적용됩니다.
4.4.1 implementation-approximated
implementation-approximated 기능은 외부
소스에 의해 전체 또는 일부가 정의되지만, 이 명세서에서 권장되는 이상적인 동작을 가집니다.
4.4.2 implementation-defined
implementation-defined 기능은 이 명세서 외부의 소스에
의해 전체 또는 일부가 정의됩니다.
4.4.3 host-defined
implementation-defined 와 동일합니다.
참고
4.4.4 type
6 절에서 정의된 데이터 값 집합
4.4.5 primitive value
Undefined, Null, Boolean, Number, BigInt, Symbol, String 타입 중 하나의 멤버로, 6 절에서 정의됨
참고
프리미티브 값은 언어 구현의 가장 낮은 수준에서 직접적으로 표현되는 데이터입니다.
4.4.6 object
Object 타입의 멤버
참고
객체는 프로퍼티의 집합이며 단일 프로토타입 객체를 가집니다. 프로토타입은 null 일 수 있습니다.
4.4.7 constructor
객체를 생성하고 초기화하는 함수
객체
참고
constructor 의 "prototype"
프로퍼티 값은 상속과 공유 프로퍼티를 구현하는 프로토타입 객체입니다.
4.4.8 prototype
다른 객체에 공유 프로퍼티를 제공하는 객체
참고
constructor 가 객체를 생성하면, 그 객체는 프로퍼티 참조를 해결하기 위해
constructor 의 "prototype"
프로퍼티를 암시적으로 참조합니다. constructor 의 "prototype"
프로퍼티는 프로그램 표현식 constructor .prototype으로 참조할 수 있습니다. 객체의 프로토타입에
프로퍼티를 추가하면, 그 프로토타입을 공유하는 모든 객체가 상속을 통해 해당 프로퍼티를 공유합니다. 또는, Object.create
내장 함수를 사용하여 명시적으로 지정된 프로토타입으로 새 객체를 생성할 수도 있습니다.
4.4.9 ordinary object
모든 객체가 지원해야 하는 필수 내부 메서드에 대해 기본 동작을 가지는 객체
4.4.10 exotic object
필수 내부 메서드 중 하나 이상에 대해 기본 동작을 가지지 않는 객체
참고
4.4.11 standard object
이 명세서에서 의미론이 정의된 객체
4.4.12 built-in object
ECMAScript 구현체에 의해 명세되고 제공되는 객체
참고
표준 내장 객체는 이 명세서에서 정의되어 있습니다. ECMAScript 구현체는 추가 내장 객체 종류를 명세하고 제공할 수 있습니다.
4.4.13 undefined value
변수가 값이 할당되지 않았을 때 사용되는 프리미티브 값
4.4.14 Undefined type
유일한 값이 undefined 인 타입
4.4.15 null value
어떤 객체 값도 의도적으로 존재하지 않음을 나타내는 프리미티브 값
4.4.16 Null type
유일한 값이 null 인 타입
4.4.17 Boolean value
Boolean type 의 멤버
참고
Boolean 값은 true 와 false 단 두 가지입니다.
4.4.18 Boolean type
true 와 false 프리미티브 값으로 구성된 타입
4.4.19 Boolean object
표준 내장 Boolean 생성자 의 인스턴스인 Object type 의 멤버
참고
Boolean 객체는 new 표현식에서 Boolean 생성자 를 사용하여 Boolean 값을 인자로 전달하여
생성됩니다. 결과 객체는 Boolean 값을 가지는 내부 슬롯을 갖습니다. Boolean 객체는 Boolean 값으로 강제 변환될 수 있습니다.
4.4.20 String value
finite 16비트 부호 없는
integer 값의 0개 이상의 순서
있는 시퀀스인 프리미티브 값
참고
문자열 값은 String type 의
멤버입니다. 시퀀스 내 각 integer 값은 일반적으로 UTF-16 텍스트의 16비트 단위를 나타냅니다. 그러나
ECMAScript는 값에 대해 16비트 부호 없는 integer 이어야 한다는 것 외에는 제한이나 요구사항을 두지 않습니다.
4.4.21 String type
모든 가능한 문자열 값의 집합
4.4.22 String object
표준 내장 String 생성자 의 인스턴스인 Object type 의 멤버
참고
문자열 객체는 new 표현식에서 String 생성자 를 사용하여 문자열 값을 인자로 전달하여 생성됩니다. 결과 객체는 문자열
값을 가지는 내부 슬롯을 갖습니다. 문자열 객체는 String 생성자 를 함수로 호출하여 문자열 값으로 강제 변환할 수 있습니다
(22.1.1.1 ).
4.4.23 Number value
프리미티브 값으로, IEEE
754-2019 값에 해당하는 배정밀도 64비트 이진 형식 값
참고
숫자 값은 Number type 의
멤버이며, 숫자의 직접적인 표현입니다.
4.4.24 Number type
NaN (“not a number”), +∞ 𝔽 (양의 무한대),
-∞ 𝔽 (음의 무한대)을 포함한 모든 가능한 Number 값의 집합
4.4.25 Number object
표준 내장 Number 생성자 의 인스턴스인 Object type 의 멤버
참고
Number 객체는 new 표현식에서 Number 생성자 를 사용하여 숫자 값을 인자로 전달하여 생성됩니다. 결과 객체는 숫자 값을
가지는 내부 슬롯을 갖습니다. Number 객체는 Number 생성자 를 함수로 호출하여 숫자 값으로 강제 변환할 수 있습니다 (21.1.1.1 ).
4.4.26 Infinity
양의 무한대 숫자 값
4.4.27 NaN
IEEE
754-2019 NaN(“not a number”) 값인 숫자 값
4.4.28 BigInt value
임의 정밀도의 integer 값에
해당하는 프리미티브 값
4.4.29 BigInt type
모든 가능한 BigInt 값의 집합
4.4.30 BigInt object
표준 내장 BigInt 생성자 의 인스턴스인 Object type 의 멤버
4.4.31 Symbol value
고유하며, 문자열이 아닌 객체 프로퍼티
키 를 나타내는 프리미티브 값
4.4.32 Symbol type
모든 가능한 심볼 값의 집합
4.4.33 Symbol object
표준 내장 Symbol 생성자 의 인스턴스인 Object type 의 멤버
4.4.34 function
서브루틴으로 호출될 수 있는 Object type 의 멤버
참고
함수는 자신의 프로퍼티 외에도, 호출될 때 동작을 결정하는 실행 코드와 상태를 포함합니다. 함수의 코드는 ECMAScript로 작성되었을 수도 있고 아닐 수도
있습니다.
4.4.35 built-in function
함수인 내장 객체
참고
내장 함수의 예로 parseInt와 Math.exp가 있습니다. 호스트 또는 구현체는 이 명세서에 기술되지 않은 추가 내장 함수를
제공할 수 있습니다.
4.4.36 built-in constructor
생성자 인 내장 함수
참고
내장 생성자 의 예로 Object와
Function이 있습니다. 호스트 또는 구현체는 이 명세서에 기술되지 않은 추가 내장 생성자 를 제공할 수
있습니다.
4.4.37 property
키(String 값 또는 Symbol 값)와 값을 연결하는 객체의 일부
참고
프로퍼티의 형태에 따라 값은 데이터 값(프리미티브 값, 객체 또는 함수 객체 )으로 직접 표현되거나, 접근자 함수 쌍으로 간접적으로 표현될 수
있습니다.
4.4.38 method
프로퍼티 값인 함수
참고
함수가 객체의 메서드로 호출될 때, 해당 객체는 함수의 this 값으로 전달됩니다.
4.4.39 built-in method
내장 함수인 메서드
참고
표준 내장 메서드는 이 명세서에서 정의되어 있습니다. 호스트 또는 구현체는 이 명세서에 기술되지 않은 추가 내장 메서드를 제공할 수 있습니다.
4.4.40 attribute
프로퍼티의 특성을 정의하는 내부 값
4.4.41 own property
해당 객체에 직접 포함된 프로퍼티
4.4.42 inherited property
객체의 프로퍼티 중 직접 포함된 것이 아니지만, 객체의 프로토타입(직접 또는 상속된)에 있는 프로퍼티
4.5 이 명세의 구성
이 명세의 나머지 부분은 다음과 같이 구성되어 있습니다:
5 절에서는 명세 전체에서 사용되는 표기 관례를 정의합니다.
6 절부터 10 절까지는 ECMAScript 프로그램이
동작하는 실행 환경을 정의합니다.
11 절부터 17 절까지는 모든 언어 기능의 구문적 인코딩과
실행 의미론을 포함하여 실제 ECMAScript 프로그래밍 언어를 정의합니다.
18 절부터 28 절까지는 ECMAScript
표준 라이브러리를 정의합니다. 여기에는 ECMAScript 프로그램이 실행 시 사용할 수 있는 모든 표준 객체의 정의가 포함됩니다.
29 절에서는
SharedArrayBuffer 기반 메모리의 접근 및 Atomics 객체 메서드의 메모리 일관성 모델을 설명합니다.
5 표기 규칙
5.1 구문 및 렉시컬 문법
5.1.1 문맥 자유 문법
문맥 자유 문법 은 여러 개의 생산 으로 구성됩니다. 각 생산은 비단말 기호 라는 추상적인 기호를 왼쪽 에 가지고,
0개 이상의 비단말 및 단말 기호 를 오른쪽 에 나열합니다. 각 문법에서 단말 기호는 지정된 알파벳에서 가져옵니다.
연쇄 생산 이란 오른쪽에 정확히 하나의 비단말 기호와 0개 이상의 단말 기호만을
가지는 생산을 말합니다.
특정 문맥 자유 문법은 목표 기호 라 불리는 하나의 구별된 비단말로 구성된 문장에서
시작하여, 시퀀스 내의 아무 비단말이나 그 비단말이 왼쪽이 되는 생산의 오른쪽으로 반복적으로 대체함으로써 결과적으로 생성할 수 있는 단말 기호의 모든 가능한 시퀀스
집합(언어 )을 지정합니다. 이 집합은 유한하거나 무한할 수 있습니다.
5.1.2 렉시컬 및 정규식 문법
ECMAScript의 렉시컬 문법 은 12 절에 제공됩니다. 이
문법의 단말 기호는 SourceCharacter 에서 정의된 규칙에 따라 Unicode 코드
포인트입니다(11.1 참조). 이 문법은 목표
기호 InputElementDiv , InputElementTemplateTail , InputElementRegExp , InputElementRegExpOrTemplateTail ,
InputElementHashbangOrRegExp 등에서
시작하여, 이러한 코드 포인트 시퀀스가 입력 요소 시퀀스로 번역되는 방식을 정의합니다.
공백 문자와 주석을 제외한 입력 요소는 ECMAScript의 구문 문법의 단말 기호가 되며, 이를 ECMAScript 토큰 이라 부릅니다. 이 토큰들은
예약어 , 식별자, 리터럴, ECMAScript 언어의
구분자입니다. 또한, 줄 종결자는 토큰으로 간주되지 않지만 입력 요소 스트림의 일부가 되어 자동 세미콜론 삽입 과정(12.10 )을 안내합니다. 단순 공백 및 한 줄 주석은
버려지며, 구문 문법을 위한 입력 요소 스트림에는 나타나지 않습니다. MultiLineComment (즉, 여러 줄에 걸쳐 있을 수 있는
/*…*/ 형태의 주석)는 줄 종결자가 없으면 단순히 버려집니다. 그러나 MultiLineComment 가 하나 이상의 줄 종결자를 포함하는 경우, 단일 줄
종결자로 대체되어 구문 문법을 위한 입력 요소 스트림의 일부가 됩니다.
ECMAScript의 정규식 문법 은 22.2.1 에 제공됩니다. 이 문법 역시 SourceCharacter 로 정의된 코드 포인트를 단말 기호로 사용합니다. 이
문법은 목표 기호 Pattern 에서 시작하여, 코드 포인트 시퀀스가 정규식 패턴으로 변환되는 방법을 설명합니다.
렉시컬 및 정규식 문법의 생산은 구분 기호로 두 개의 콜론 “:: ”을 사용하여 구분됩니다. 렉시컬 문법과 정규식 문법은 일부 생산을 공유합니다.
5.1.3 숫자 문자열 문법
숫자 문자열 문법 은 7.1.4.1 에서 나타납니다. 이 문법은
SourceCharacter 를 단말 기호로
사용하며, 목표 기호 StringNumericLiteral 에서 시작하여 문자열을 숫자 값으로
변환하는 데 사용됩니다(이는 숫자 리터럴의 렉시컬 문법 과 유사하지만 다릅니다).
숫자 문자열 문법의 생산은 세 개의 콜론 “::: ”으로 구분되며, 소스 텍스트 파싱에는 절대 사용되지 않습니다.
5.1.4 구문 문법
ECMAScript의 구문 문법 은 13 부터 16 까지의 절에 제공됩니다. 이 문법은
렉시컬 문법에서 정의된 ECMAScript 토큰을 단말 기호로 사용합니다(5.1.2 ). 목표
기호 Script 와
Module 에서 시작하여, 토큰 시퀀스가 ECMAScript
프로그램의 구문적으로 올바른 독립 구성 요소를 형성하는 방법을 설명합니다.
코드 포인트 스트림을 ECMAScript Script 또는
Module 로 파싱할 때, 먼저 렉시컬 문법을 반복적으로 적용하여
입력 요소 스트림으로 변환합니다. 그 후 이 입력 요소 스트림을 단일 구문 문법 적용으로 파싱합니다. 입력 스트림의 토큰들이 목표 비단말(Script 또는 Module )의 단일 인스턴스로 파싱될 수 없거나 토큰이 남아 있다면 구문 오류입니다.
파싱에 성공하면, 파싱 트리 라는 루트가 있는 트리 구조를 생성합니다. 각 노드는 파싱 노드 입니다. 각 파싱 노드는 문법 기호의 인스턴스 이며, 해당 기호로부터 유도될 수 있는 소스 텍스트의 범위를
나타냅니다. 파싱 트리의 루트 노드(소스 텍스트 전체를 나타냄)는 파싱의 목표 기호 의 인스턴스입니다. 파싱 노드가
비단말의 인스턴스인 경우, 그 비단말을 왼쪽으로 하는 생산의 인스턴스이기도 합니다. 또한, 오른쪽에 있는 각 기호마다 0개 이상의 자식 을 가지며, 각 자식은
해당 기호의 파싱 노드 인스턴스입니다.
새로운 파싱 노드는 파서 호출마다 인스턴스화되며 동일한 소스 텍스트라도 파싱 간에는 재사용되지 않습니다. 파싱 노드는 동일한 소스 텍스트 범위를 나타내고, 동일한 문법 기호의
인스턴스이며, 동일한 파서 호출에서 생성된 경우에만 동일한 파싱 노드 로 간주됩니다.
참고 1
동일한 문자열을 여러 번 파싱하면 서로 다른 파싱 노드가 생성됩니다. 예를 들어,
let str = "1 + 1;" ;
eval (str);
eval (str);
각 eval 호출은 str의 값을 ECMAScript 소스 텍스트 로 변환하고, 각기
독립적으로 파싱하여 별도의 파싱 노드 트리를 생성합니다. 각 파싱은 동일한 문자열 값에서 유래했더라도 트리는 서로 다릅니다.
참고 2
파싱 노드는 명세상의 산물이며, 구현체는 유사한 데이터 구조를 사용할 필요는 없습니다.
구문 문법의 생산은 구분 기호로 하나의 콜론 “: ”만을 사용합니다.
13 부터 16 까지 제시된 구문 문법은
ECMAScript Script 또는 Module 에 대해 허용되는 토큰 시퀀스의 완전한 설명이 아닙니다. 특정
추가 토큰 시퀀스도 허용되는데, 이는 특정 위치(예: 줄 종결자 앞)에 세미콜론만 추가하면 문법에서 설명될 수 있는 시퀀스입니다. 또한, 문법에서 설명된 일부 토큰 시퀀스는
특정 “어색한” 위치에 줄 종결자가 나타나면 허용되지 않습니다.
특정 경우, 모호성을 피하기 위해 구문 문법은 유효한 ECMAScript Script 또는 Module 를 형성하지 않는 토큰 시퀀스도 허용하는 일반화된 생산을 사용합니다. 예를 들어, 객체
리터럴 및 객체 구조 분해 패턴에서 이 기법이 사용됩니다. 이러한 경우, 허용되는 토큰 시퀀스를 더욱 제한하는 보조 문법 이 제공됩니다. 일반적으로
조기 오류 규칙은 특정
문맥에서 "P 는 N 을 포함해야 한다 "라고 명시합니다. 여기서
P 는 일반화된 생산의 파싱 노드 인스턴스이며 N 은 보조 문법의 비단말입니다. 이는 다음을 의미합니다:
P 가 원래 매칭한 토큰 시퀀스를 N 을 목표 기호 로 하여 다시 파싱합니다.
N 이 문법 파라미터를 가지면, P 가 원래 파싱될 때와 동일한 값으로 설정합니다.
토큰 시퀀스가 N 의 단일 인스턴스로 파싱될 수 있고, 토큰이 남지 않으면:
해당 P 에 대해 고유한 N 인스턴스를 "P 가 포함하는
N ”이라고 부릅니다.
N 및 그 파생 생산에 대한 모든 조기 오류 규칙은 P 가 포함하는 N 에도 적용됩니다.
그렇지 않으면(파싱이 실패하면) 조기 문법 오류입니다.
5.1.5 문법 표기법
5.1.5.1 단말 기호
ECMAScript 문법에서 일부 단말 기호는 고정폭 글꼴로 표시됩니다.
이러한 기호는 소스 텍스트에 정확히 작성된 대로 나타나야 합니다. 이 방식으로 지정된 모든 단말 기호 코드 포인트는 기본 라틴 블록의 적절한 Unicode 코드
포인트로 이해되어야 하며, 다른 Unicode 범위의 유사한 코드 포인트와는 다릅니다.
단말 기호의 코드 포인트는 \ UnicodeEscapeSequence 로 표현할 수 없습니다.
단말 기호가 개별 Unicode 코드 포인트인 문법(즉, 렉시컬, 정규식, 숫자 문자열 문법)에서, 생산 내 여러 고정폭 코드 포인트가 연속적으로 나타나는 것은 동일한
시퀀스의 코드 포인트를 각각 독립된 단말 기호로 작성하는 것에 대한 간단한 약어입니다.
예를 들어, 다음 생산:
HexIntegerLiteral
::
0x
HexDigits
는 다음과 같은 약어입니다:
HexIntegerLiteral
::
0
x
HexDigits
반대로, 구문 문법에서는 고정폭 코드 포인트가 연속적으로 나타나면 하나의 단일 단말 기호입니다.
단말 기호는 다음 두 가지 형태도 있습니다:
5.1.5.2 비단말 기호 및 생산
비단말 기호는 이탤릭체 로 표시됩니다. 비단말의 정의(생산이라고도 함)는 정의되는 비단말의 이름 뒤에 하나 이상의 콜론이 붙어 도입됩니다. (콜론의 개수는
해당 생산이 속하는 문법을 나타냅니다.) 비단말의 하나 이상의 대체 오른쪽 부분이 뒤따라 나열됩니다. 예를 들어, 구문 정의는 다음과 같습니다:
WhileStatement
:
while
(
Expression
)
Statement
이 정의는 WhileStatement 비단말이
while 토큰, 이어서 왼쪽 괄호 토큰, 이어서 Expression , 이어서 오른쪽 괄호 토큰, 이어서 Statement 를 나타냄을 의미합니다. Expression 및 Statement 는 각각 비단말입니다. 또 다른 예시로,
구문 정의는 다음과 같습니다:
ArgumentList
:
AssignmentExpression
ArgumentList
,
AssignmentExpression
이 정의는 ArgumentList 가 하나의 AssignmentExpression
또는 ArgumentList 뒤에 쉼표, 그리고
AssignmentExpression 가 올 수 있음을 의미합니다.
이 ArgumentList 정의는 재귀적이며, 자기
자신을 기준으로 정의됩니다. 결과적으로 ArgumentList 는 쉼표로 구분된 임의의
개수의 인수를 포함할 수 있으며, 각 인수 식은 AssignmentExpression 입니다. 이러한 비단말의
재귀적 정의는 흔합니다.
5.1.5.3 선택적 기호
단말 또는 비단말 뒤에 나타날 수 있는 아래첨자 접미사 “opt ”는 선택적 기호임을 나타냅니다. 선택적 기호가 포함된 대안은 실제로 선택적 요소를
생략한 오른쪽과 포함한 오른쪽의 두 가지를 지정합니다. 이는 다음을 의미합니다:
VariableDeclaration
:
BindingIdentifier
Initializer opt
는 다음과 같은 편리한 약어입니다:
VariableDeclaration
:
BindingIdentifier
BindingIdentifier
Initializer
그리고 다음과 같습니다:
ForStatement
:
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
는 다음과 같은 편리한 약어입니다:
ForStatement
:
for
(
LexicalDeclaration
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression
;
Expression opt
)
Statement
이는 다시 다음과 같은 약어입니다:
ForStatement
:
for
(
LexicalDeclaration
;
)
Statement
for
(
LexicalDeclaration
;
Expression
)
Statement
for
(
LexicalDeclaration
Expression
;
)
Statement
for
(
LexicalDeclaration
Expression
;
Expression
)
Statement
즉, 이 예시에서 ForStatement 비단말은 실제로 네 가지
대안 오른쪽을 가집니다.
5.1.5.4 문법 파라미터
생산은 아래첨자 주석 "[parameters] " 형태로 파라미터화될 수 있으며, 이는 생산에서 정의된 비단말 기호의 접미사로 나타날 수 있습니다.
“parameters ”는 하나의 이름 또는 쉼표로 구분된 이름 목록일 수 있습니다. 파라미터화된 생산은 해당 파라미터 이름의 모든 조합에 대한
생산 집합을 나타내는 약어로, 파라미터화된 비단말 기호 뒤에 언더스코어와 함께 붙여집니다. 이는 다음을 의미합니다:
StatementList [Return]
:
ReturnStatement
ExpressionStatement
는 다음과 같은 편리한 약어입니다:
StatementList
:
ReturnStatement
ExpressionStatement
StatementList_Return
:
ReturnStatement
ExpressionStatement
그리고 다음과 같습니다:
StatementList [Return,
In] :
ReturnStatement
ExpressionStatement
는 다음과 같은 약어입니다:
StatementList
:
ReturnStatement
ExpressionStatement
StatementList_Return
:
ReturnStatement
ExpressionStatement
StatementList_In
:
ReturnStatement
ExpressionStatement
StatementList_Return_In
:
ReturnStatement
ExpressionStatement
여러 파라미터는 조합적으로 많은 생산을 생성하며, 이들 모두가 반드시 완전한 문법에서 참조되는 것은 아닙니다.
생산의 오른쪽에 있는 비단말 참조 역시 파라미터화될 수 있습니다. 예를 들어:
StatementList
:
ReturnStatement
ExpressionStatement [+In]
는 다음과 동일합니다:
StatementList
:
ReturnStatement
ExpressionStatement_In
그리고 다음과 같습니다:
StatementList
:
ReturnStatement
ExpressionStatement [~In]
는 다음과 동일합니다:
StatementList
:
ReturnStatement
ExpressionStatement
비단말 참조는 파라미터 목록과 “opt ” 접미사를 모두 가질 수 있습니다. 예를 들어:
VariableDeclaration
:
BindingIdentifier
Initializer [+In] opt
는 다음과 같은 약어입니다:
VariableDeclaration
:
BindingIdentifier
BindingIdentifier
Initializer_In
오른쪽 비단말 참조에 파라미터 이름 앞에 “? ”를 붙이면, 해당 파라미터 값이 현재 생산의 왼쪽 기호 참조에 나타나는 파라미터 이름에 의존함을
의미합니다. 예를 들어:
VariableDeclaration [In]
:
BindingIdentifier
Initializer [?In]
는 다음과 같은 약어입니다:
VariableDeclaration
:
BindingIdentifier
Initializer
VariableDeclaration_In
:
BindingIdentifier
Initializer_In
오른쪽 대안에 “[+parameter]”가 접두사로 붙으면, 해당 대안은 지정된 파라미터가 생산의 비단말 기호 참조에 사용될 때만 사용할 수 있습니다.
“[~parameter]”가 접두사로 붙으면, 해당 대안은 지정된 파라미터가 사용되지 않을 때만 사용할 수 있습니다. 이는 다음을 의미합니다:
StatementList [Return]
: [+Return]
ReturnStatement
ExpressionStatement
는 다음과 같은 약어입니다:
StatementList
:
ExpressionStatement
StatementList_Return
:
ReturnStatement
ExpressionStatement
그리고 다음과 같습니다:
StatementList [Return]
: [~Return]
ReturnStatement
ExpressionStatement
는 다음과 같은 약어입니다:
StatementList
:
ReturnStatement
ExpressionStatement
StatementList_Return
:
ExpressionStatement
5.1.5.5 one of
문법 정의에서 콜론 뒤에 “one of ”가 나오면, 다음 줄 또는 줄들에 있는 각 단말 기호가 대안 정의임을 나타냅니다. 예를 들어, ECMAScript의
렉시컬 문법에는 다음과 같은 생산이 있습니다:
NonZeroDigit
:: one of 1
2 3 4 5 6
7 8 9
이는 다음과 같은 간편한 약어입니다:
NonZeroDigit
::
1
2
3
4
5
6
7
8
9
5.1.5.6 [empty]
생산의 오른쪽에 “[empty]”라는 문구가 나타나면, 해당 생산의 오른쪽에 단말 또는 비단말이 없음을 나타냅니다.
5.1.5.7 전방 탐색 제한
생산의 오른쪽에 “[lookahead = seq ]” 문구가 나타나면, 해당 생산은 토큰 시퀀스 seq 가 즉시 뒤따르는 입력 토큰
시퀀스의 접두사인 경우에만 사용할 수 있음을 나타냅니다. 마찬가지로 “[lookahead ∈ set ]”에서 set 은
유한 하고 비어 있지 않은 토큰
시퀀스 집합일 때, 해당 생산은 집합의 일부 요소가 즉시 뒤따르는 토큰 시퀀스의 접두사인 경우에만 사용할 수 있음을 나타냅니다. 편의를 위해 집합을 비단말로도 쓸 수
있는데, 이 경우 해당 비단말이 확장될 수 있는 모든 토큰 시퀀스의 집합을 나타냅니다. 만약 비단말이 무한히 많은 토큰 시퀀스로 확장될 수 있다면 이는 편집상 오류로
간주됩니다.
이 조건들은 부정될 수 있습니다. “[lookahead ≠ seq ]”는 seq 가 즉시 뒤따르는 입력 토큰 시퀀스의 접두사가
아닌 경우에만 해당 생산을 사용할 수 있음을 나타내며, “[lookahead ∉ set ]”는 어느 요소도 즉시
뒤따르는 토큰 시퀀스의 접두사가 아닌 경우에만 해당 생산을 사용할 수 있음을 나타냅니다.
예시로, 다음 정의가 주어졌을 때:
DecimalDigit
:: one of 0
1 2 3 4 5
6 7 8 9
DecimalDigits
::
DecimalDigit
DecimalDigits
DecimalDigit
다음과 같은 정의에서:
LookaheadExample
::
n
[lookahead ∉ { 1 , 3 , 5 ,
7 , 9 }]
DecimalDigits
DecimalDigit
[lookahead ∉ DecimalDigit ]
이 정의는 n 문자 뒤에 하나 이상의 십진수 숫자가 오는데, 첫 번째 숫자가 짝수인 경우, 또는 십진수 숫자가 뒤에 다른 십진수 숫자가 오지
않는 경우를 매칭합니다.
이러한 문구가 구문 문법에서 사용될 때는, 즉시 뒤따르는 토큰 시퀀스를 명확하게 식별하는 것이 불가능할 수 있습니다. 이후 토큰을 결정하려면 이후 위치에서 사용할
렉시컬 목표 기호 를 알아야 하기 때문입니다. 따라서 구문 문법에서
이러한 제한이 사용될 때, 토큰 시퀀스 seq 가 전방 탐색 제한에(집합의 일부로 포함되는 경우 포함하여) 나타나고, 사용되는 렉시컬
목표 기호 의 선택에 따라 seq 가 결과 토큰
시퀀스의 접두사가 될 수 있는지 여부가 달라진다면, 이는 편집상 오류로 간주됩니다.
구문 문법의 생산 오른쪽에 “[여기 LineTerminator 없음]”이라는 문구가 나타나면, 해당 생산은
제한된 생산 임을 의미합니다. 즉, 입력 스트림의 지정된 위치에 LineTerminator 가 발생하면 사용할 수 없습니다. 예를 들어, 다음
생산:
ThrowStatement
:
throw
[여기 LineTerminator 없음]
Expression
;
이 생산은 throw 토큰과 Expression 사이에 LineTerminator 가 스크립트에 있으면 사용할 수 없음을 나타냅니다.
제한된 생산에 의해 LineTerminator 의 존재가 금지되지 않는 한, 입력 요소 스트림 내의
연속된 두 토큰 사이에는 임의의 개수의 LineTerminator 가 있어도 스크립트의 구문적 허용성에는 영향을 주지
않습니다.
5.1.5.9 but not
생산의 오른쪽에 “but not ” 문구를 사용하여, 확장 중 특정 경우를 허용하지 않음을 지정할 수 있습니다. 예를 들어, 다음 생산:
Identifier
::
IdentifierName
but not ReservedWord
이 정의는 Identifier 비단말이 IdentifierName 로 대체될 수 있으나,
같은 코드 포인트 시퀀스가 ReservedWord 로도 대체될 수 있다면 허용되지 않음을 의미합니다.
5.1.5.10 설명적 문구
마지막으로, 경우에 따라 모든 대안을 나열하는 것이 비현실적일 때 몇몇 비단말 기호는 산세리프체 설명 문구로 서술됩니다:
SourceCharacter
::
모든 Unicode 코드 포인트
5.2 알고리즘 규칙
명세에서는 종종 번호가 매겨진 목록을 사용하여 알고리즘의 단계를 지정합니다. 이러한 알고리즘은 ECMAScript 언어 구성 요소의 필수 의미를 정확히 명시하는 데 사용됩니다. 이
알고리즘들은 특정 구현 기법의 사용을 암시하려는 의도가 아닙니다. 실제로는 주어진 기능을 구현할 때 더 효율적인 알고리즘이 있을 수 있습니다.
알고리즘은 명시적으로 매개변수화될 수 있으며, 쉼표로 구분된 순서의 별칭 이름 시퀀스를 사용하여, 알고리즘 단계 내에서 해당 위치에 전달된 인수를 참조할 수 있습니다. 선택적
매개변수는 괄호([ , name ])로 둘러싸여 있으며, 알고리즘 단계 내에서는 필수 매개변수와 다르지 않습니다. 나머지 매개변수(rest parameter)는
매개변수 목록의 끝에 ...name 형태로 나타나며, 필수 및 선택적 매개변수 뒤에 제공된 모든 인수를 List 에 담습니다. 추가 인수가 없다면 해당
List 는 비어 있습니다.
알고리즘 단계는 순차적 하위 단계로 세분화될 수 있습니다. 하위 단계는 들여쓰기되며, 자체적으로 추가 하위 단계로 나눌 수 있습니다. 개요 번호 규칙에 따라 첫 번째 하위 단계는
소문자 알파벳, 두 번째 하위 단계는 소문자 로마 숫자가 사용됩니다. 세 단계보다 많으면 네 번째 단계는 숫자 라벨을 사용하며, 예시는 다음과 같습니다:
최상위 단계
하위 단계.
하위 단계.
하위하위 단계.
하위하위하위 단계
하위하위하위하위 단계
하위하위하위하위하위 단계
단계 또는 하위 단계는 “if” 조건문으로 작성되어 그 하위 단계를 조건부로 적용할 수 있습니다. 이 경우, 조건이 참일 때만 하위 단계가 적용됩니다. 단계 또는 하위 단계가
“else”로 시작하면, 같은 수준의 앞선 “if” 조건문의 부정 조건입니다.
단계는 그 하위 단계를 반복적으로 적용한다고 명시할 수 있습니다.
“Assert :”로 시작하는 단계는 알고리즘의 불변 조건을 주장합니다. 이러한 주장은 암묵적인 알고리즘적 불변
조건을 명시적으로 드러내기 위해 사용됩니다. 이러한 주장은 추가적인 의미적 요구사항을 부과하지 않으므로 구현체에서 반드시 검사할 필요는 없습니다. 오로지 알고리즘을 명확히 하기
위해 사용됩니다.
알고리즘 단계에서는 “Let x be someValue ” 형태로 명명된 별칭(alias)을 선언할 수 있습니다. 이 별칭은 참조처럼 동작하여
x 와 someValue 모두 동일한 데이터 기반을 참조하며, 둘 중 하나를 변경하면 모두에게 반영됩니다. 참조와 같은 동작을 피하고 싶다면
“Let x be a copy of someValue ”처럼 오른쪽 값을 복사하도록 명시해야 하며, 이는
someValue 의 얕은 복사본을 생성합니다.
한 번 선언된 별칭은 이후 단계에서 참조할 수 있으며, 별칭 선언 이전의 단계에서는 참조해서는 안 됩니다. 별칭은 “Set x to
someOtherValue ” 형태로 수정할 수 있습니다.
5.2.1 추상 연산
명세의 여러 부분에서 사용될 수 있도록, 일부 알고리즘은 추상 연산 이라 불리며, 이름이 붙고 매개변수화된 함수 형태로 작성되어
다른 알고리즘에서 이름으로 참조될 수 있습니다. 추상 연산은 보통 OperationName(arg1 , arg2 )과 같은 함수 호출
방식으로 참조됩니다. 일부 추상 연산은 클래스와 유사한 명세 추상화의 다형적으로 호출되는 메서드로 취급되기도 합니다. 이러한 메서드형 추상 연산은 일반적으로
someValue .OperationName(arg1 , arg2 )와 같은 메서드 호출 방식으로 참조됩니다.
5.2.2 구문 지향 연산
구문 지향 연산 이란, 하나 이상의 ECMAScript 문법
생산에 연결된 알고리즘으로 구성된 이름 있는 연산입니다. 여러 대안 정의가 있는 생산은 일반적으로 각 대안마다 별도의 알고리즘을 가집니다. 알고리즘이 문법 생산에 연결되면,
해당 대안의 단말 및 비단말 기호를 알고리즘의 매개변수처럼 참조할 수 있습니다. 이 방식에서 비단말 기호는 소스 텍스트를 파싱할 때 실제로 일치한 대안 정의를 참조합니다.
문법 생산이나 그로부터 파생된 파싱
노드 가 일치시킨 소스 텍스트 란, 일치에 참여한 첫 번째 단말부터 마지막 단말까지의 소스 텍스트 부분을 의미합니다.
알고리즘이 생산 대안에 연결되면, 대안은 일반적으로 “[ ]” 문법 주석 없이 표시됩니다. 이러한 주석은 대안의 구문 인식에만 영향을 주며, 연결된 의미에는 영향을 주지
않습니다.
구문 지향 연산은 파싱 노드와 필요하다면 추가 매개변수를 전달하여, 다음 알고리즘의 1 , 3 , 4 단계 규칙을 따라 호출됩니다:
Let status be SyntaxDirectedOperation of
SomeNonTerminal .
Let someParseNode be the parse of some source text.
Perform SyntaxDirectedOperation of
someParseNode .
Perform SyntaxDirectedOperation of
someParseNode with argument "value" .
명시적으로 달리 지정하지 않는 한, 모든 연쇄 생산 은 해당 생산의 왼쪽 비단말에 적용될 수 있는 모든 연산에
대한 암묵적 정의를 가집니다. 암묵적 정의는 동일한 연산을 동일한 매개변수로, 해당 연쇄 생산 의 유일한 오른쪽 비단말에 다시
적용한 뒤 그 결과를 반환합니다. 예를 들어, 어떤 알고리즘이 “Return Evaluation of Block ” 단계를 가진다고 가정하고, 다음과 같은 생산이 있다고 합시다:
Block :
{
StatementList
}
하지만 Evaluation 연산이 해당 생산에 알고리즘을 연결하지 않았다면, Evaluation 연산은
암묵적으로 다음과 같은 연결을 포함합니다:
런타임 의미: Evaluation
Block :
{
StatementList
}
Return Evaluation of StatementList .
5.2.3 런타임 의미
런타임에 호출되어야 할 의미를 명시하는 알고리즘을 런타임 의미 라 합니다. 런타임 의미는 추상 연산 이나 구문 지향 연산 으로
정의됩니다.
5.2.3.1 Completion ( completionRecord )
추상 연산 Completion은 completionRecord (Completion Record )
인자를 받아 Completion Record 를
반환합니다. 이는 Completion Record 가
반환됨을 강조할 때 사용됩니다. 다음 단계를 수행합니다:
Assert :
completionRecord 는 Completion
Record 이다.
completionRecord 를 반환한다.
5.2.3.2 예외 던지기
예외를 던지라고 하는 알고리즘 단계, 예:
TypeError 예외를 던진다.
는 다음과 동일한 의미입니다:
Return ThrowCompletion (새롭게 생성된
TypeError 객체).
5.2.3.3 ReturnIfAbrupt
다음과 같은 알고리즘 단계 혹은 동등한 단계:
ReturnIfAbrupt (argument ).
는 다음과 동일한 의미입니다:
Assert :
argument 는 Completion
Record 이다.
만약 argument 가 abrupt
completion 이면, Completion (argument )를
반환한다.
그렇지 않으면, argument 를 argument .[[Value]] 로 설정한다.
다음과 같은 알고리즘 단계 혹은 동등한 단계:
ReturnIfAbrupt (AbstractOperation()).
는 다음과 동일한 의미입니다:
hygienicTemp 를 AbstractOperation()의 결과로 설정한다.
Assert :
hygienicTemp 는 Completion
Record 이다.
만약 hygienicTemp 가 abrupt
completion 이면, Completion (hygienicTemp )를
반환한다.
그렇지 않으면, hygienicTemp 를 hygienicTemp .[[Value]] 로 설정한다.
hygienicTemp 는 ReturnIfAbrupt와 관련된 단계 내에서만 잠시 사용됩니다.
다음과 같은 알고리즘 단계 혹은 동등한 단계:
result 를 AbstractOperation(ReturnIfAbrupt (argument ))의
결과로 설정한다.
는 다음과 동일한 의미입니다:
Assert :
argument 는 Completion
Record 이다.
만약 argument 가 abrupt
completion 이면, Completion (argument )를
반환한다.
그렇지 않으면, argument 를 argument .[[Value]] 로 설정한다.
result 를 AbstractOperation(argument )의 결과로 설정한다.
5.2.3.4 ReturnIfAbrupt 약어
추상 연산 및
구문 지향 연산
호출 앞에 ?가 붙으면, 결과 Completion
Record 에 ReturnIfAbrupt 를 적용해야 함을 나타냅니다. 예:
? OperationName().
다음 단계와 동일합니다:
ReturnIfAbrupt (OperationName()).
유사하게, 메서드 호출 방식에서는 다음 단계:
? someValue .OperationName().
다음과 동일합니다:
ReturnIfAbrupt (someValue .OperationName()).
유사하게, ! 접두사는 뒤따르는 추상 또는 구문 지향
연산 이 abrupt
completion 을 반환하지 않고, 결과 Completion Record 의
[[Value]] 필드를 연산의 반환 값으로 사용해야 함을 나타냅니다. 예:
Let val be ! OperationName().
다음 단계와 동일합니다:
Let val be OperationName().
Assert :
val 은 normal
completion 이다.
val 을 val .[[Value]] 로 설정한다.
구문 지향
연산 은 런타임 의미 에서 ! 또는
?를 연산 호출 앞에 붙여 이 약어를 사용합니다:
Perform ! SyntaxDirectedOperation of NonTerminal .
5.2.3.5 암묵적 정상 완료
추상 연산 에서
Completion Record 를
반환한다고 선언된 알고리즘과 모든 내장 함수에서, 반환값은 먼저 NormalCompletion 에 전달되고, 그 결과가 실제로 사용됩니다.
이 규칙은 Completion 알고리즘 내부나, 반환값이 해당 단계에서 명확히
Completion Record 로
표시된 경우에는 적용되지 않습니다. 이러한 경우는 다음과 같습니다:
이러한 추상 연산에서 다른 방식으로 Completion
Record 가 반환되면 편집상 오류입니다. 예를 들어, 이러한 추상 연산 내에서,
Return true .
는 다음과 같은 단계와 동일합니다:
Return NormalCompletion (true ).
또는
Let completion be NormalCompletion (true ).
Return Completion (completion ).
또는
Return Completion
Record { [[Type]] :
normal , [[Value]] :
true , [[Target]] :
empty }.
ReturnIfAbrupt 확장 규칙을 통해, 다음 예시는 허용됩니다.
확장된 단계 내에서는 Completion 의 결과가 비정상(abrupt)인 경우 직접 반환되고,
정상(normal)인 경우 언랩 후 암묵적으로 NormalCompletion 이 적용됩니다.
Return ? completion .
다음 예시는 Completion Record 가
해당 단계에서 명시적으로 표시되지 않고 반환되므로 편집상 오류입니다.
Let completion be NormalCompletion (true ).
Return completion .
5.2.4 정적 의미
문맥 자유 문법만으로는 입력 요소 스트림이 평가 가능한 유효한 ECMAScript Script 또는 Module 인지 결정하는 모든 규칙을 표현하기에는 충분하지 않습니다. 어떤 상황에서는
ECMAScript 알고리즘 규칙이나 산문적 요구사항으로 표현되는 추가 규칙이 필요합니다. 이러한 규칙은 항상 문법 생산에 연결되며, 해당 생산의 정적 의미 라 불립니다.
정적 의미 규칙은 이름을 가지며, 보통 알고리즘으로 정의됩니다. 이름 있는 정적 의미 규칙은 문법 생산에 연결되고, 여러 대안 정의가 있는 생산은 각 대안마다 적용 가능한
이름 있는 정적 의미 규칙에 대해 별도의 알고리즘을 가집니다.
정적 의미 규칙의 특수한 종류가 조기 오류 규칙 입니다. 조기 오류 규칙은 특정 문법 생산과
연결된 조기 오류 조건을
정의합니다(17 절 참조). 대부분의
조기 오류 규칙에 대한
Evaluation
호출은 명세 알고리즘 내에서 명시적으로 호출되지 않습니다. 적합한 구현체는 Script 또는 Module 을 최초로 평가하기 전에, 해당 Script 또는 Module 을 파싱하는 데 사용된 모든 생산의 조기 오류 규칙을 검사해야 합니다. 만약 조기 오류 규칙이 위반되면, 해당
Script 또는 Module 은 유효하지 않으며 평가될 수 없습니다.
5.2.5 수학 연산
이 명세에서는 다음과 같은 종류의 수치 값을 참조합니다:
이 명세에서 수치 값은 아래첨자 접미사를 통해 서로 다른 숫자 종류로 구분됩니다. 𝔽 는 Number, ℤ 는 BigInt를 의미합니다.
접미사가 없는 수치 값은 수학적 값 을 의미합니다. 대부분의 수치 값은 10진수로 표기되며, 0x로 시작하는
경우 16진수 값입니다.
일반적으로 명세에서 "the length of y " 또는 "the integer represented by the four hexadecimal digits ..."처럼
숫자 종류를 명시하지 않을 때는 수학적 값 을 의미합니다. Number 또는 BigInt 값은 명시적으로 표시됩니다.
예: "the Number
value for the number of code points in …" 또는 "the BigInt value
for …".
명세에서 정수(integer) 란 별도 명시가 없는 한 수학적 값
중 정수 집합에 속하는 값을
의미합니다. 정수(Number) 란 유한 Number 값 중 수학적
값 이 정수 집합에 속하는 값을 의미합니다.
+, ×, =, ≥ 등의 수치 연산자는 피연산자의 타입에 따라 해당 연산을 의미합니다. 수학적 값 에 적용하면 일반적인 수학 연산을 의미합니다.
확장 수학적 값 에 적용하면 확장 실수에 대한 연산을 의미하며,
결정할 수 없는 형태는 정의되지 않으며 명세에서 사용하면 편집상 오류입니다. Number에 적용하면 IEEE 754-2019 의 관련 연산을 의미합니다.
BigInt에 적용하면 해당 BigInt의 수학적 값 에 대한 일반적인 수학 연산을 의미합니다. 서로 다른 타입의
피연산자(예: Number와 수학적 값 )에 적용된 수치 연산자는 정의되지 않으며, 명세에서 사용하면 편집상
오류입니다.
수학적
값 과 Number 또는 BigInt 간 변환은 항상 명시적으로 이루어집니다. 수학적 값
또는 확장 수학적 값 x 를 Number로 변환하는
것은 "the Number
value for x " 또는 𝔽(x ) 으로 표기하며, 6.1.6.1 에서 정의됩니다.
정수 x 를
BigInt로 변환하는 것은 "the BigInt value for
x " 또는 ℤ(x ) 으로 표기합니다.
Number 또는 BigInt x 를 수학적 값 으로 변환하는 것은 "the mathematical value of x " 또는
ℝ(x ) 으로 표기합니다. mathematical
value of +0 𝔽 와
-0 𝔽 은 수학적 값 0입니다. mathematical
value of 비-유한 값은 정의되지 않습니다. extended mathematical value of x 는 유한 값에서는 mathematical
value of x 와 동일하며, +∞ 𝔽 및
-∞ 𝔽 에는 +∞, -∞이고, NaN 에는 정의되지 않습니다.
수학 함수 abs(x ) 는 x 의
절대값을 반환하며, x < 0이면 -x , 그렇지 않으면
x 자체입니다.
수학 함수 min(x1 , x2 , … ,
xN ) 는 x1 부터 xN 중 가장 작은 값을 반환합니다. max(x1 , x2 , ..., xN ) 는 가장 큰 값을
반환합니다. 이 함수들의 정의역과 치역은 확장 수학적 값 입니다.
표기 “x modulo
y ”(y 는 유한 이며 0이 아니어야 함)은 y 와 부호가 같거나 0인 k 값을
계산하며, abs (k ) < abs (y ) 이고,
x - k = q × y 인 정수 q 가 존재합니다.
“the result of clamping x between
lower and upper ”(x 는 확장
수학적 값 , lower , upper 는 수학적
값 이고 lower ≤ upper )은 x <
lower 면 lower 를, x > upper 면 upper 를, 그렇지
않으면 x 를 반환합니다.
수학 함수 floor(x ) 는
x 보다 크지 않은 가장 큰 정수 (+∞에 가장 가까운)를 반환합니다.
참고
floor (x ) = x -
(x modulo 1) .
수학 함수 truncate(x ) 는
x 의 소수 부분을 제거하여 0에 가까워지도록 반올림합니다. x < 0이면 -floor (-x ) , 그렇지 않으면 floor (x ) 을 반환합니다.
수학 함수 min , max , abs , floor , truncate 는 Number와 BigInt에는 정의되지 않으며,
비-수학적
값 인수가 사용되면 편집상 오류입니다.
구간(interval) 은 하한 a 에서 상한 b 까지의, 같은 숫자
타입의 값을 요소로 가지는 (무한하거나 비어 있을 수 있는) 집합입니다. 각 경계는 포함 또는 배타로 설명됩니다. 다음 네 가지 구간이 있습니다:
구간
a (포함)에서 b (포함)까지, 즉 포함
구간 a 에서 b 까지는 a ≤ x ≤ b 인 같은
타입의 값 x 를 모두 포함합니다.
구간
a (포함)에서 b (배타)까지는 a ≤ x < b 인 값을 모두
포함합니다.
구간
a (배타)에서 b (포함)까지는 a < x ≤ b 인 값을 모두
포함합니다.
구간
a (배타)에서 b (배타)까지는 a < x < b 인 값을
모두 포함합니다.
예를 들어, 1(포함)에서 2(배타)까지의 구간 은 1과 2 사이의 모든 수학적 값 을 포함하며, 1은 포함하고 2는 포함하지
않습니다. 구간 정의를 위해 -0 𝔽 < +0 𝔽 이므로,
예를 들어 하한이 +0 𝔽 인 포함 구간 은
+0 𝔽 는 포함하지만 -0 𝔽 는 포함하지 않습니다.
NaN 은 어떤 구간 에도 포함되지 않습니다.
5.2.6 값 표기법
이 명세에서 ECMAScript 언어 값 은 굵은
글씨 로 표시됩니다. 예시로 null , true ,
"hello" 등이 있습니다. 이는 ECMAScript 소스 텍스트 (예:
Function.prototype.apply 또는 let n = 42;)와 구별됩니다.
5.2.7 동일성(Identity)
이 명세에서는 명세 값과 ECMAScript 언어 값 모두 동등성 비교를 수행합니다.
비교 시 값은 두 범주로 나뉩니다. 동일성 없는 값(value without identity) 은 모든 고유 특성이 같으면 서로 동등합니다— 예: 정수 의 크기, 시퀀스의 길이 등. 동일성 없는
값은 특성을 완전히 기술하는 것만으로도 나타낼 수 있습니다. 반면, 동일성 있는
값(value with identity) 은 고유하며 자기 자신과만 동등합니다. 동일성 있는 값은 동일성 없는 값과 같지만 identity 라
불리는 추가적이고 유일하며 변하지 않는 특성을 가집니다. 기존 동일성 있는 값에 대한 참조는 단순히 특성을 기술하는 것만으로 생성할 수 없으며, 반드시 명시적으로 전달되어야
합니다. 동일성 있는 값 중 일부는 변경 가능(mutable)하며, 특성(동일성 제외)이 변경될 수 있어 모든 참조자에게 새로운 특성이 관찰됩니다. 동일성 없는 값은 동일성
있는 값과 절대 동등하지 않습니다.
명세 관점에서 “is”는 두 값을 동등성 비교하는 데 사용되며(예: “If bool is true , then ...”),
“contains”는 리스트 내에서 동등성 비교로 값을 찾는 데 사용됩니다(예: "If list contains a Record r such
that r .[[Foo]] is true , then ...").
명세 동일성 은 이러한 비교의 결과를 결정하며, 이 명세에서 공리적으로 정의됩니다.
ECMAScript 언어 관점에서는, 언어 값은 SameValue 추상 연산 및 그에 의해 전이적으로 호출되는 추상 연산 으로 비교됩니다. 이 비교
추상 연산 알고리즘이
ECMAScript 언어 값 의 언어 동일성 을
결정합니다.
명세 값에 대해, 동일성 없는 값의 예는 수학적 값 , 확장
수학적 값 , ECMAScript 소스 텍스트 , 서로게이트 페어 ,
Directive
Prologues 등, UTF-16 코드 유닛, Unicode 코드 포인트, enum , 추상 연산 및 구문 지향 연산 ,
host hook , 순서쌍
등입니다. 명세 동일성을 가지는 값의 예는 Record (Property Descriptor ,
PrivateElement 등 포함),
파싱
노드 , List ,
Set 및 Relation , Abstract
Closure , Data Block , Private Name , 실행
컨텍스트 , 실행 컨텍스트 스택 , agent signifier , WaiterList
Record 등입니다.
명세 동일성은 ECMAScript 언어 값 중 Symbol.for 로 생성된
Symbol 값을 제외하고는 모두 언어 동일성과 일치합니다. 명세 동일성도, 언어 동일성도 가지지 않는 ECMAScript 언어 값은 undefined ,
null ,
Boolean , String , Number , BigInt 입니다. 명세 동일성과 언어
동일성을 모두 가지는 ECMAScript 언어 값은 Symbol (Symbol.for 로 생성된
것은 제외)과 Object 입니다. Symbol.for 로 생성된 Symbol 값은 명세 동일성은 있으나
언어 동일성은 없습니다.
6 ECMAScript 데이터 타입과 값
이 명세의 알고리즘은 각 값이 관련 타입을 가진 값을 다룹니다. 가능한 값 타입은 바로 이 절에서 정의된 타입들입니다. 타입은 ECMAScript 언어 타입 과 명세 타입으로 더 분류됩니다.
6.1 ECMAScript 언어 타입
ECMAScript 언어 타입 은 ECMAScript 프로그래머가
ECMAScript 언어를 사용하여 직접 다루는 값에 해당합니다.
ECMAScript 언어 타입에는 Undefined, Null, Boolean, String, Symbol, Number, BigInt, Object가 있습니다.
ECMAScript 언어 값 은 ECMAScript 언어 타입으로
특징지어지는 값입니다.
6.1.1 Undefined 타입
Undefined 타입은 undefined 라 불리는 정확히 하나의 값을 가집니다. 값이 할당되지 않은 변수는
undefined 값을 가집니다.
6.1.2 Null 타입
Null 타입은 null 이라 불리는 정확히 하나의 값을 가집니다.
6.1.3 Boolean 타입
Boolean 타입 은
true 와 false 라 불리는 두 값을 가지는 논리적 개체를 나타냅니다.
6.1.4 String 타입
String 타입 은 253 - 1개의
요소까지 0개 이상의 16비트 부호 없는 정수 값(“요소”)의 모든 순서 있는 시퀀스의 집합입니다. String 타입은 일반적으로 실행 중인
ECMAScript 프로그램에서 텍스트 데이터를 표현하는 데 사용되며, 이 경우 String의 각 요소는 UTF-16 코드 유닛 값으로 처리됩니다. 각 요소는 시퀀스 내에서
위치를 차지합니다. 이 위치는 0 이상의 정수 로 인덱싱됩니다. 첫 번째 요소(있다면)는 인덱스 0에, 그 다음 요소는 인덱스 1에, 이런 식으로
이어집니다. String의 길이는 그 안의 요소(즉, 16비트 값) 개수입니다. 빈 문자열은 길이가 0이며 요소를 포함하지 않습니다.
String 내용을 해석하지 않는 ECMAScript 연산은 추가 의미를 적용하지 않습니다. String 값을 해석하는 연산은 각 요소를 하나의 UTF-16 코드 유닛으로
처리합니다. 하지만 ECMAScript는 이러한 코드 유닛의 값이나 관계를 제한하지 않으므로, String 내용을 UTF-16로 인코딩된 유니코드 코드 포인트 시퀀스로 추가
해석하는 연산은 잘못된 서브시퀀스를 고려해야 합니다. 그러한 연산은 다음 규칙에 따라 0xD800부터 0xDBFF까지의 포함
구간 에 있는 코드 유닛(유니코드 표준에서 선행 서러게이트 , 더 공식적으로는 고서러게이트 코드
유닛 )과 0xDC00부터 0xDFFF까지의 포함 구간 에 있는 코드 유닛(후행 서러게이트 , 더 공식적으로는 저서러게이트 코드
유닛 )을 특별히 처리합니다:
String.prototype.normalize 함수(22.1.3.15 )는 String 값을
명시적으로 정규화하는 데 사용할 수 있습니다. String.prototype.localeCompare(22.1.3.12 )는 내부적으로 String 값을
정규화하지만, 그 외 연산은 문자열을 암묵적으로 정규화하지 않습니다. 연산 결과는 달리 명시되지 않는 한, 언어 또는 로케일에 민감하지 않습니다.
참고
이 설계의 근거는 문자열 구현을 최대한 단순하고 빠르게 유지하기 위함이었습니다. ECMAScript 소스 텍스트 가 정규형
C(Normalized Form C)라면, 문자열 리터럴도 유니코드 이스케이프 시퀀스를 포함하지 않는 한 정규화됨이 보장됩니다.
이 명세에서 “A , B , ...의 문자열
연결(string-concatenation) ”(각 인자는 String 값, 코드 유닛, 코드 유닛 시퀀스임)은 각 인자의 코드 유닛(순서대로)을
이어붙인(순서대로) 코드 유닛 시퀀스로 구성된 String 값을 의미합니다.
“S 의 inclusiveStart 에서 exclusiveEnd 까지의 부분 문자열(substring) ”(S 는 String 값 또는 코드 유닛 시퀀스,
inclusiveStart 와 exclusiveEnd 는 정수 )는 S 의 인덱스 inclusiveStart 에서 시작해
exclusiveEnd 바로 앞까지의 연속된 코드 유닛으로 구성된 String 값을 의미합니다(만약 inclusiveStart =
exclusiveEnd 이면 빈 문자열). “to” 접미사가 생략되면 S 의 길이가 exclusiveEnd 값으로
사용됩니다.
“ASCII 단어 문자 ”는 다음 String 값을 의미합니다. 이 값은 유니코드
기본 라틴 블록 내의 모든 문자와 숫자 및 U+005F(LOW LINE)만으로 구성됩니다:
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_" .
역사적 이유로 여러 알고리즘에서 의미가 있습니다.
6.1.4.1 StringIndexOf ( string ,
searchValue , fromIndex )
추상 연산 StringIndexOf는 string (String), searchValue (String),
fromIndex (0 이상의 정수 )를 인자로 받고, 0 이상의 정수 또는 not-found 를
반환합니다. 다음 단계를 수행합니다:
len 을 string 의 길이로 설정한다.
searchValue 가 빈 문자열이고 fromIndex ≤ len 이면
fromIndex 를 반환한다.
searchLen 을 searchValue 의 길이로 설정한다.
fromIndex ≤ i ≤ len - searchLen 인 모든
정수
i 에 대해 오름차순으로 다음을 수행한다:
candidate 를 string 의 i 에서 i +
searchLen 까지의 부분 문자열 로 설정한다.
candidate 가 searchValue 와 같으면 i 를 반환한다.
not-found 를 반환한다.
참고 1
searchValue 가 빈 문자열이고 fromIndex ≤ string 의 길이인 경우, 이
알고리즘은 fromIndex 를 반환합니다. 빈 문자열은 문자열 내의 모든 위치(마지막 코드 유닛 뒤까지 포함)에서 발견되는 것으로
간주됩니다.
참고 2
이 알고리즘은 fromIndex + searchValue 의 길이가 string 의 길이를
초과하면 항상 not-found 를 반환합니다.
6.1.4.2 StringLastIndexOf ( string ,
searchValue , fromIndex )
추상 연산 StringLastIndexOf는 string (String), searchValue (String),
fromIndex (0 이상의 정수 )를 인자로 받고, 0 이상의 정수 또는 not-found 를
반환합니다. 다음 단계를 수행합니다:
len 을 string 의 길이로 설정한다.
searchLen 을 searchValue 의 길이로 설정한다.
Assert :
fromIndex + searchLen ≤ len .
0 ≤ i ≤ fromIndex 인 모든 정수 i 에 대해 내림차순으로 다음을
수행한다:
candidate 를 string 의 i 에서 i +
searchLen 까지의 부분 문자열 로 설정한다.
candidate 가 searchValue 와 같으면 i 를 반환한다.
not-found 를 반환한다.
참고
searchValue 가 빈 문자열인 경우, 이 알고리즘은 fromIndex 를 반환합니다. 빈 문자열은 문자열 내의
모든 위치(마지막 코드 유닛 뒤까지 포함)에서 발견되는 것으로 간주됩니다.
6.1.5 심볼(Symbol) 타입
Symbol 타입 은 객체 프로퍼티의 키로 사용할 수 있는
모든 문자열이 아닌 값의 집합입니다(6.1.7 ).
모든 Symbol 값은 고유하며 변경할 수 없습니다.
각 Symbol 값은 [[Description]] 이라 불리는 관련 값을 변경 불가능하게 보유하며, 이는
undefined 또는 문자열 값입니다.
6.1.5.1 잘 알려진 심볼(Well-Known Symbols)
잘 알려진 심볼은 이 명세의 알고리즘에서 명시적으로 참조되는 내장 Symbol 값입니다. 일반적으로 명세 알고리즘의 확장 포인트로 사용되는 프로퍼티의 키로 사용됩니다.
별도 명시가 없는 한, 잘 알려진 심볼 값은 모든 realm (9.3 )에서 공유됩니다.
이 명세에서는 잘 알려진 심볼을 표준 내장 표기법(intrinsic notation) 을
사용하여 참조하며, 내장은 표 1 에 나열된 값 중 하나입니다.
참고
이전 판 명세에서는 @@name 형태의 표기를 사용했으나, 현재 판에서는
%Symbol.name%를 사용합니다. 특히 다음 이름이 사용되었습니다: @@asyncIterator, @@hasInstance,
@@isConcatSpreadable, @@iterator , @@match, @@matchAll,
@@replace, @@search, @@species, @@split, @@toPrimitive, @@toStringTag, 그리고
@@unscopables.
표 1: 잘 알려진 심볼(Well-known Symbols)
명세 이름
[[Description]]
값 및 목적
%Symbol.asyncIterator%
"Symbol.asyncIterator"
객체의 기본 비동기 이터레이터(async
iterator) 를 반환하는 메서드입니다.
for-await-of 문의 의미론에서 호출됩니다.
%Symbol.hasInstance%
"Symbol.hasInstance"
생성자(constructor) 객체가 특정 객체를
자신의 인스턴스로 인식하는지 결정하는 메서드입니다. instanceof 연산자의 의미론에서 호출됩니다.
%Symbol.isConcatSpreadable%
"Symbol.isConcatSpreadable"
true일 경우 Array.prototype.concat 에
의해 객체가 배열 요소로 펼쳐져 평탄화(flatten)되어야 함을 나타내는 불리언 프로퍼티입니다.
%Symbol.iterator%
"Symbol.iterator"
객체의 기본 이터레이터(iterator) 를
반환하는 메서드입니다. for-of 문의 의미론에서 호출됩니다.
%Symbol.match%
"Symbol.match"
정규식이 문자열과 매칭되는지 확인하는 정규식 메서드입니다. String.prototype.match
메서드에서 호출됩니다.
%Symbol.matchAll%
"Symbol.matchAll"
정규식이 문자열 전체에서 매칭되는 부분을 이터레이터(iterator) 로
반환하는 정규식 메서드입니다. String.prototype.matchAll
메서드에서 호출됩니다.
%Symbol.replace%
"Symbol.replace"
문자열에서 매칭된 부분 문자열을 대체하는 정규식 메서드입니다. String.prototype.replace
메서드에서 호출됩니다.
%Symbol.search%
"Symbol.search"
문자열 내에서 정규식이 매칭되는 인덱스를 반환하는 정규식 메서드입니다. String.prototype.search
메서드에서 호출됩니다.
%Symbol.species%
"Symbol.species"
파생 객체를 생성하는 데 사용되는 생성자 함수 인 함수 값 프로퍼티입니다.
%Symbol.split%
"Symbol.split"
정규식과 매칭되는 인덱스에서 문자열을 분할하는 정규식 메서드입니다. String.prototype.split
메서드에서 호출됩니다.
%Symbol.toPrimitive%
"Symbol.toPrimitive"
객체를 대응하는 원시값(primitive value)으로 변환하는 메서드입니다. ToPrimitive 추상 연산에서
호출됩니다.
%Symbol.toStringTag%
"Symbol.toStringTag"
객체의 기본 문자열 설명을 생성할 때 사용하는 문자열 값 프로퍼티입니다. 내장 메서드 Object.prototype.toString 에서
접근됩니다.
%Symbol.unscopables%
"Symbol.unscopables"
자신의 프로퍼티 이름 및 상속된 프로퍼티 이름이 관련 객체의 with 환경 바인딩에서 제외되는 프로퍼티
이름인 객체 값 프로퍼티입니다.
6.1.6 숫자 타입
ECMAScript에는 두 가지 내장 숫자 타입이 있습니다: Number와 BigInt. 아래 추상 연산 들은 이러한 숫자 타입에
대해 정의되어 있습니다. "결과" 열에는 반환 타입과, 일부 연산 호출 시 비정상 완료(abrupt
completion) 가 반환될 수 있는지 여부가 표시됩니다.
표 2: 숫자 타입 연산
연산(Operation)
예시 소스(Example source)
Evaluation 의미론에서 호출됨
결과(Result)
Number::unaryMinus
-x
단항 -
연산자
Number
BigInt::unaryMinus
BigInt
Number::bitwiseNOT
~x
비트 NOT 연산자
(~)
Number
BigInt::bitwiseNOT
BigInt
Number::exponentiate
x ** y
거듭제곱 연산자
및 Math.pow ( base , exponent
)
Number
BigInt::exponentiate
BigInt를 포함하는 정상
완료(normal completion) 또는 예외 완료(throw
completion)
Number::multiply
x * y
곱셈 연산자(Multiplicative
Operators)
Number
BigInt::multiply
BigInt
Number::divide
x / y
곱셈 연산자(Multiplicative
Operators)
Number
BigInt::divide
BigInt를 포함하는 정상
완료(normal completion) 또는 예외 완료(throw
completion)
Number::remainder
x % y
곱셈 연산자(Multiplicative
Operators)
Number
BigInt::remainder
BigInt를 포함하는 정상
완료(normal completion) 또는 예외 완료(throw
completion)
Number::add
x ++
++ x
x + y
후위 증가 연산자(Postfix Increment
Operator) ,
전위 증가 연산자(Prefix Increment
Operator) ,
더하기 연산자(+) (The Addition
Operator)
Number
BigInt::add
BigInt
Number::subtract
x --
-- x
x - y
후위 감소 연산자(Postfix Decrement
Operator) ,
전위 감소 연산자(Prefix Decrement
Operator) ,
빼기 연산자(-) (The Subtraction
Operator)
Number
BigInt::subtract
BigInt
Number::leftShift
x << y
왼쪽 시프트 연산자(<<) (The Left Shift
Operator)
Number
BigInt::leftShift
BigInt
Number::signedRightShift
x >> y
부호 있는 오른쪽 시프트 연산자(>>)
(The Signed Right Shift Operator)
Number
BigInt::signedRightShift
BigInt
Number::unsignedRightShift
x >>> y
부호 없는 오른쪽 시프트
연산자(>>>) (The Unsigned Right Shift Operator)
Number
BigInt::unsignedRightShift
예외 완료(throw
completion)
Number::lessThan
x < y
x > y
x <= y
x >= y
관계 연산자(Relational
Operators) ,
IsLessThan ( x , y ,
LeftFirst )
Boolean 또는 undefined (정렬되지 않은 입력)
BigInt::lessThan
Boolean
Number::equal
x == y
x != y
x === y
x !== y
동등 연산자(Equality
Operators) ,
IsStrictlyEqual ( x ,
y )
Boolean
BigInt::equal
Number::sameValue
Object.is(x, y)
객체 내부 메서드,
SameValue ( x , y
) 를 통해 정확한 값 비교
Boolean
Number::sameValueZero
[x].includes(y)
SameValueZero ( x , y
) 를 통해, +0 𝔽 와
-0 𝔽 의 차이를 무시하고 값 비교 (Array, Map, Set 메서드 등)
Boolean
Number::bitwiseAND
x & y
이진 비트 연산자(Binary Bitwise
Operators)
Number
BigInt::bitwiseAND
BigInt
Number::bitwiseXOR
x ^ y
Number
BigInt::bitwiseXOR
BigInt
Number::bitwiseOR
x | y
Number
BigInt::bitwiseOR
BigInt
Number::toString
String(x)
다양한 표현식 및 내장 함수에서, ToString ( argument
) 을 통해 호출됨
String
BigInt::toString
숫자 타입은 일반적으로 정밀도 손실이나 잘림(truncation) 없이 변환할 수 없기 때문에, ECMAScript 언어에서는 이러한 타입 간에 암묵적인 변환을 제공하지
않습니다. 프로그래머는 다른 타입을 요구하는 함수를 호출할 때 Number 또는 BigInt 함수를 명시적으로 호출하여 타입을
변환해야 합니다.
참고
ECMAScript의 초판 및 이후 판에서는 일부 연산자에 대해 정밀도 손실이나 잘림(truncate) 이 발생할 수 있는 암묵적 숫자 변환을 제공했습니다.
이러한 레거시 암묵 변환은 하위 호환성을 위해 유지되지만, BigInt에는 제공되지 않습니다. 이는 프로그래머의 실수 가능성을 줄이고, 미래 판에서는 일반화된
값 타입(value types) 도입의 여지를 남기기 위함입니다.
6.1.6.1 Number 타입
Number 타입 은 정확히
18,437,736,874,454,810,627개(즉, 264 - 253 +
3 ) 값을 가지며, IEEE 754-2019 에서 지정된 IEEE 배정밀도
부동소수점(binary64) 값을 나타냅니다. 단, IEEE 표준의 9,007,199,254,740,990개(즉, 253 - 2 ) NaN 값은 ECMAScript에서는 하나의 특별한
NaN 값으로 표현됩니다. (NaN 값은 프로그램 표현식 NaN으로
생성됩니다.) 일부 구현에서는 외부 코드가 다양한 NaN 값을 구분할 수 있지만, 그러한 동작은 구현
정의(implementation-defined) 입니다. ECMAScript 코드에서는 모든
NaN 값은 서로 구별되지 않습니다.
참고
Number 값이 ArrayBuffer(25.1 )나
SharedArrayBuffer(25.2 )에 저장된 후 관찰되는 비트
패턴은 ECMAScript 구현에서 사용하는 Number 값의 내부 표현과 반드시 같지 않을 수 있습니다.
그 외에도 양의 무한대(positive Infinity) 와 음의 무한대(negative
Infinity) 라는 두 개의 특별한 값이 있습니다. 간결하게 각각 +∞ 𝔽 와
-∞ 𝔽 로도 설명합니다. (이 두 무한대 Number 값은 +Infinity(또는
Infinity)와 -Infinity 표현식으로 생성됩니다.)
나머지 18,437,736,874,454,810,624개(즉, 264 -
253 ) 값은 유한(finite) 숫자라 불립니다. 이
중 절반은 양수, 절반은 음수입니다. 모든 유한 양의 Number 값에는 동일한 크기의 음수 값이 대응됩니다.
양의 0(positive zero )와 음의 0(negative zero )도 있습니다. 간결하게 각각
+0 𝔽 와 -0 𝔽 로 설명합니다. (이 두 0 값은
+0(또는 0)과 -0 표현식으로 생성됩니다.)
18,437,736,874,454,810,622개(즉, 264 - 253 -
2 ) 유한
0이 아닌 값은 두 가지 종류가 있습니다:
18,428,729,675,200,069,632개(즉, 264 -
254 )는 정규화(normalized)되어 있으며, 다음과 같은 형태를 가집니다:
s × m × 2e
여기서 s 는 1 또는 -1, m 은 정수 이며 구간(interval) [252 , 253 )에 속하고,
e 는 정수 이며 포함 구간 [-1074, 971]에 속합니다.
나머지 9,007,199,254,740,990개(즉, 253 - 2 ) 값은
비정규화(denormalized)되어 있으며, 다음과 같은 형태를 가집니다:
s × m × 2e
여기서 s 는 1 또는 -1, m 은 정수 이며 구간(interval) (0, 252 )에 속하고, e 는
-1074입니다.
크기가 253 이하인 모든 양의 및 음의 정수 는 Number 타입으로 표현 가능합니다. 정수 0은 Number 타입에서
+0 𝔽 와 -0 𝔽 두 가지로 표현됩니다.
유한 숫자가 0이 아니고 위의 두
형태 중 정수
m 이 홀수이면 홀수 시그니피컨드(odd significand) 를 가지며, 그렇지 않으면 짝수 시그니피컨드(even
significand) 를 가집니다.
이 명세에서 “the Number value for x ”라는 문구에서 x 가
정확한 실수(π와 같은 무리수 포함)를 나타낼 때, 다음 방식으로 Number 값을 선택함을 의미합니다. Number 타입의 모든 유한 값 집합에서
-0 𝔽 을 제거하고, Number 타입으로 표현할 수 없는 두 값을 추가합니다:
21024 (+1 × 253 × 2971 )와
-21024 (-1 ×
253 × 2971 ). 이 집합에서 x 에 가장 가까운 값을 선택합니다. 두 값이
동일하게 가까울 경우, 짝수 시그니피컨드를 가진 값을 선택합니다. 이때 두 추가 값 21024 와 -21024 은 짝수 시그니피컨드를 가진 것으로 간주합니다. 마지막으로,
21024 가 선택되면 +∞ 𝔽 로, -21024 가 선택되면 -∞ 𝔽 로,
+0 𝔽 가 선택되면 x < 0일 때만
-0 𝔽 로 바꿉니다. 그 외의 경우 선택한 값을 그대로 사용합니다. 그 결과가 Number value
for x 입니다. (이 절차는 IEEE 754-2019 의 roundTiesToEven
모드와 정확히 일치합니다.)
Number value
for +∞는 +∞ 𝔽 이고, Number value
for -∞는 -∞ 𝔽 입니다.
일부 ECMAScript 연산자는 정수 의 특정 범위(예: 포함 구간 -231 부터 231 -
1 까지, 또는 포함 구간 0부터 216 - 1 까지)만 다룹니다. 이러한 연산자는 Number 타입의 모든 값을 허용하지만,
우선 해당 값을 기대하는 범위의 정수 값으로 변환합니다. 숫자 변환 연산에 대한 설명은 7.1 를 참조하세요.
6.1.6.1.1 Number::unaryMinus ( x )
추상 연산 Number::unaryMinus는 인자 x (Number)를 받고 Number를 반환합니다. 호출 시 다음 단계를 수행합니다:
x 가 NaN 이면 NaN 을 반환한다.
x 의 부호를 반전한 값을 반환한다. 즉, 크기는 같지만 부호가 반대인 Number를 계산한다.
6.1.6.1.2 Number::bitwiseNOT ( x )
추상 연산 Number::bitwiseNOT는 인자 x (Number)를 받고 정수(Number) 를 반환합니다. 호출 시 다음
단계를 수행합니다:
oldValue 를 ! ToInt32 (x )로 설정한다.
oldValue 의 비트 보수를 반환한다. 결과의 수학적 값 은 32비트
2의 보수 비트열로 정확히 표현된다.
6.1.6.1.3 Number::exponentiate ( base ,
exponent )
추상 연산 Number::exponentiate는 인자 base (Number), exponent (Number)를 받고
Number를 반환합니다. base 를 exponent 거듭제곱한 결과를 나타내는 구현 근사값 을 반환합니다. 호출 시 다음 단계를
수행합니다:
exponent 가 NaN 이면 NaN 을 반환한다.
exponent 가 +0 𝔽 또는
-0 𝔽 이면 1 𝔽 을 반환한다.
base 가 NaN 이면 NaN 을 반환한다.
base 가 +∞ 𝔽 이면
exponent > +0 𝔽 이면
+∞ 𝔽 을 반환하고, 아니면
+0 𝔽 을 반환한다.
base 가 -∞ 𝔽 이면
exponent > +0 𝔽 이면
exponent 가 홀수 정수(Number) 이면
-∞ 𝔽 을 반환, 아니면
+∞ 𝔽 을 반환한다.
그 외
exponent 가 홀수 정수(Number) 이면
-0 𝔽 을 반환, 아니면
+0 𝔽 을 반환한다.
base 가 +0 𝔽 이면
exponent > +0 𝔽 이면
+0 𝔽 을 반환, 아니면
+∞ 𝔽 을 반환한다.
base 가 -0 𝔽 이면
exponent > +0 𝔽 이면
exponent 가 홀수 정수(Number) 이면
-0 𝔽 을 반환, 아니면
+0 𝔽 을 반환한다.
그 외
exponent 가 홀수 정수(Number) 이면
-∞ 𝔽 을 반환, 아니면
+∞ 𝔽 을 반환한다.
Assert :
base 는 유한(finite) 이며
+0 𝔽 또는 -0 𝔽 이 아니다.
exponent 가 +∞ 𝔽 이면
abs (ℝ (base )) >
1이면 +∞ 𝔽 반환
abs (ℝ (base )) = 1이면
NaN 반환
abs (ℝ (base )) <
1이면 +0 𝔽 반환
exponent 가 -∞ 𝔽 이면
abs (ℝ (base )) >
1이면 +0 𝔽 반환
abs (ℝ (base )) = 1이면
NaN 반환
abs (ℝ (base )) <
1이면 +∞ 𝔽 반환
Assert :
exponent 는 유한(finite) 이며
+0 𝔽 또는 -0 𝔽 이 아니다.
base < -0 𝔽 이고 exponent 가
정수(Number) 가 아니면
NaN 반환
구현 근사값 Number 값을
반환하며, 이는 ℝ (base )를 ℝ (exponent ) 거듭제곱한 값이다.
참고
base 가 1 𝔽 또는
-1 𝔽 이고 exponent 가
+∞ 𝔽 또는 -∞ 𝔽 인 경우, 또는
base 가 1 𝔽 이고 exponent 가
NaN 인 경우의 base ** exponent
결과는 IEEE 754-2019 와 다릅니다. ECMAScript
초판은 이 연산에서 NaN 을 반환했지만, 이후 IEEE 754에서는
1 𝔽 을 명시합니다. 호환성 유지를 위해 ECMAScript의 역사적 동작을 따릅니다.
6.1.6.1.4 Number::multiply ( x , y )
추상 연산 Number::multiply는 인자 x (Number), y (Number)를 받고 Number를 반환합니다.
IEEE
754-2019 배정밀도 이진 산술 규칙에 따라 곱셈을 수행하여 x 와 y 의
곱을 생성합니다. 호출 시 다음 단계를 수행합니다:
x 가 NaN 이거나 y 가 NaN 이면
NaN 반환
x 가 +∞ 𝔽 또는
-∞ 𝔽 이면
y 가 +0 𝔽 또는
-0 𝔽 이면 NaN 반환
y > +0 𝔽 이면 x 반환
-x 반환
y 가 +∞ 𝔽 또는
-∞ 𝔽 이면
x 가 +0 𝔽 또는
-0 𝔽 이면 NaN 반환
x > +0 𝔽 이면 y 반환
-y 반환
x 가 -0 𝔽 이면
y 가 -0 𝔽 이거나 y <
-0 𝔽 이면 +0 𝔽
반환
그 외에는 -0 𝔽 반환
y 가 -0 𝔽 이면
x < -0 𝔽 이면
+0 𝔽 반환
그 외에는 -0 𝔽 반환
𝔽 (ℝ (x ) ×
ℝ (y ))
반환
참고
유한(finite) 정밀 곱셈은 교환법칙은 성립하지만, 항상 결합법칙이
성립하는 것은 아닙니다.
6.1.6.1.5 Number::divide ( x , y )
추상 연산 Number::divide는 인자 x (Number), y (Number)를 받고 Number를 반환합니다.
IEEE
754-2019 배정밀도 이진 산술 규칙에 따라 나눗셈을 수행하며, x 를
피제수(dividend), y 를 제수(divisor)로 하여 몫을 생성합니다. 호출 시 다음 단계를 수행합니다:
x 가 NaN 이거나 y 가 NaN 이면
NaN 반환
x 가 +∞ 𝔽 또는
-∞ 𝔽 이면
y 가 +∞ 𝔽 또는
-∞ 𝔽 이면 NaN 반환
y 가 +0 𝔽 또는 y >
+0 𝔽 이면 x 반환
-x 반환
y 가 +∞ 𝔽 이면
x 가 +0 𝔽 또는 x >
+0 𝔽 이면 +0 𝔽
반환, 아니면 -0 𝔽 반환
y 가 -∞ 𝔽 이면
x 가 +0 𝔽 또는 x >
+0 𝔽 이면 -0 𝔽
반환, 아니면 +0 𝔽 반환
x 가 +0 𝔽 또는
-0 𝔽 이면
y 가 +0 𝔽 또는
-0 𝔽 이면 NaN 반환
y > +0 𝔽 이면 x 반환
-x 반환
y 가 +0 𝔽 이면
x > +0 𝔽 이면
+∞ 𝔽 반환, 아니면
-∞ 𝔽 반환
y 가 -0 𝔽 이면
x > +0 𝔽 이면
-∞ 𝔽 반환, 아니면
+∞ 𝔽 반환
𝔽 (ℝ (x ) /
ℝ (y ))
반환
6.1.6.1.6 Number::remainder ( n , d )
추상 연산 Number::remainder는 인자 n (Number), d (Number)를 받고 Number를 반환합니다.
n 을 피제수(dividend), d 를 제수(divisor)로 하는 암시적 나눗셈에서의 나머지를 구합니다. 호출 시 다음
단계를 수행합니다:
n 이 NaN 이거나 d 가 NaN 이면
NaN 을 반환한다.
n 이 +∞ 𝔽 또는
-∞ 𝔽 이면 NaN 을 반환한다.
d 이 +∞ 𝔽 또는
-∞ 𝔽 이면 n 을 반환한다.
d 이 +0 𝔽 또는
-0 𝔽 이면 NaN 을 반환한다.
n 이 +0 𝔽 또는
-0 𝔽 이면 n 을 반환한다.
Assert :
n 과 d 는 유한 이며 0이 아니다.
quotient 를 ℝ (n ) / ℝ (d )로 설정한다.
q 를 truncate (quotient )로 설정한다.
r 를 ℝ (n ) - (ℝ (d ) × q )로
설정한다.
r = 0이고 n < -0 𝔽 이면
-0 𝔽 을 반환한다.
𝔽 (r )을 반환한다.
참고 1
C와 C++에서 나머지 연산자는 정수 피연산자만 허용하지만, ECMAScript에서는 부동소수점 피연산자도 허용합니다.
참고 2
% 연산자로 계산된 부동소수점 나머지 연산 결과는 IEEE 754-2019 에서
정의한 "나머지(remainder)" 연산과 동일하지 않습니다. IEEE의 "remainder" 연산은 잘림이 아닌 반올림 나눗셈에서의 나머지를
계산하므로, 일반적인 정수 나머지 연산자와는 다릅니다. ECMAScript에서는 부동소수점
% 연산이 Java 정수 나머지 연산자와 유사하게 동작하도록 정의되어
있으며, 이는 C 표준 라이브러리의 fmod 함수와 비교할 수 있습니다.
6.1.6.1.7 Number::add ( x , y )
추상 연산 Number::add는 인자 x (Number), y (Number)를 받고 Number를 반환합니다.
IEEE
754-2019 배정밀도 이진 산술 규칙에 따라 덧셈을 수행하여 인자의 합을 생성합니다. 호출 시 다음 단계를
수행합니다:
x 가 NaN 이거나 y 가 NaN 이면
NaN 반환
x 가 +∞ 𝔽 이고 y 가
-∞ 𝔽 이면 NaN 반환
x 가 -∞ 𝔽 이고 y 가
+∞ 𝔽 이면 NaN 반환
x 가 +∞ 𝔽 또는
-∞ 𝔽 이면 x 반환
y 가 +∞ 𝔽 또는
-∞ 𝔽 이면 y 반환
Assert :
x 와 y 는 모두 유한 이다.
x 가 -0 𝔽 이고 y 가
-0 𝔽 이면 -0 𝔽 반환
𝔽 (ℝ (x ) +
ℝ (y ))
반환
참고
유한 정밀
덧셈은 교환법칙은 성립하지만, 항상 결합법칙이 성립하는 것은 아닙니다.
6.1.6.1.8 Number::subtract ( x , y )
추상 연산 Number::subtract는 인자 x (Number), y (Number)를 받고 Number를 반환합니다.
뺄셈을 수행하여 피감수(minuend) x 와 감수(subtrahend) y 의 차를 생성합니다. 호출 시 다음 단계를
수행합니다:
Number::add (x ,
Number::unaryMinus (y ))를
반환한다.
참고
언제나 x - y는 x + (-y)와 동일한 결과를 생성합니다.
6.1.6.1.9 Number::leftShift ( x , y )
추상 연산 Number::leftShift는 인자 x (Number), y (Number)를 받고 정수(Number) 를 반환합니다. 호출 시 다음 단계를 수행합니다:
lNum 을 ! ToInt32 (x )로 설정한다.
rNum 을 ! ToUint32 (y )로 설정한다.
shiftCount 를 ℝ (rNum ) modulo 32로 설정한다.
lNum 을 shiftCount 비트만큼 왼쪽 시프트한 결과를 반환한다. 결과의 수학적 값 은 32비트 2의 보수 비트열로 정확히
표현된다.
6.1.6.1.10 Number::signedRightShift ( x ,
y )
추상 연산 Number::signedRightShift는 인자 x (Number), y (Number)를 받고
정수(Number) 를 반환합니다. 호출 시 다음 단계를 수행합니다:
lNum 을 ! ToInt32 (x )로 설정한다.
rNum 을 ! ToUint32 (y )로 설정한다.
shiftCount 를 ℝ (rNum ) modulo 32로 설정한다.
lNum 을 shiftCount 비트만큼 부호 확장(right shift with sign
extension) 하여 오른쪽 시프트한 결과를 반환한다. 최상위 비트가 전파된다. 결과의 수학적 값 은 32비트 2의 보수 비트열로 정확히
표현된다.
6.1.6.1.11 Number::unsignedRightShift ( x ,
y )
추상 연산 Number::unsignedRightShift는 인자 x (Number), y (Number)를 받고
정수(Number) 를 반환합니다. 호출 시 다음 단계를 수행합니다:
lNum 을 ! ToUint32 (x )로 설정한다.
rNum 을 ! ToUint32 (y )로 설정한다.
shiftCount 를 ℝ (rNum ) modulo 32로 설정한다.
lNum 을 shiftCount 비트만큼 0으로 채우며 오른쪽 시프트한 결과를 반환한다. 비워진 비트는
0으로 채워진다. 결과의 수학적 값 은 32비트 부호 없는 비트열로 정확히
표현된다.
6.1.6.1.12 Number::lessThan ( x , y )
추상 연산 Number::lessThan는 인자 x (Number), y (Number)를 받고 Boolean 또는
undefined 를 반환합니다. 호출 시 다음 단계를 수행합니다:
x 가 NaN 이면 undefined 반환
y 가 NaN 이면 undefined 반환
x 가 y 이면 false 반환
x 가 +0 𝔽 이고 y 가
-0 𝔽 이면 false 반환
x 가 -0 𝔽 이고 y 가
+0 𝔽 이면 false 반환
x 가 +∞ 𝔽 이면 false 반환
y 가 +∞ 𝔽 이면 true 반환
y 가 -∞ 𝔽 이면 false 반환
x 가 -∞ 𝔽 이면 true 반환
Assert :
x 와 y 는 유한 이다.
ℝ (x )
< ℝ (y )이면 true 반환,
아니면 false 반환
6.1.6.1.13 Number::equal ( x , y )
추상 연산 Number::equal는 인자 x (Number), y (Number)를 받고 Boolean을 반환합니다. 호출
시 다음 단계를 수행합니다:
x 가 NaN 이면 false 반환
y 가 NaN 이면 false 반환
x 가 y 이면 true 반환
x 가 +0 𝔽 이고 y 가
-0 𝔽 이면 true 반환
x 가 -0 𝔽 이고 y 가
+0 𝔽 이면 true 반환
false 반환
6.1.6.1.14 Number::sameValue ( x , y )
추상 연산 Number::sameValue는 인자 x (Number), y (Number)를 받고 Boolean을
반환합니다. 호출 시 다음 단계를 수행합니다:
x 가 NaN 이고 y 가 NaN 이면
true 반환
x 가 +0 𝔽 이고 y 가
-0 𝔽 이면 false 반환
x 가 -0 𝔽 이고 y 가
+0 𝔽 이면 false 반환
x 가 y 이면 true 반환
false 반환
6.1.6.1.15 Number::sameValueZero ( x ,
y )
추상 연산 Number::sameValueZero는 인자 x (Number), y (Number)를 받고 Boolean을
반환합니다. 호출 시 다음 단계를 수행합니다:
x 가 NaN 이고 y 가 NaN 이면
true 반환
x 가 +0 𝔽 이고 y 가
-0 𝔽 이면 true 반환
x 가 -0 𝔽 이고 y 가
+0 𝔽 이면 true 반환
x 가 y 이면 true 반환
false 반환
6.1.6.1.16 NumberBitwiseOp ( op , x ,
y )
추상 연산 NumberBitwiseOp는 인자 op (&, ^, 또는
|), x (Number), y (Number)를 받고 정수(Number) 를 반환합니다. 호출 시 다음 단계를 수행합니다:
lNum 을 ! ToInt32 (x )로 설정한다.
rNum 을 ! ToInt32 (y )로 설정한다.
lBits 를 ℝ (lNum )을 나타내는 32비트 2의 보수 비트열로 설정한다.
rBits 를 ℝ (rNum )을 나타내는 32비트 2의 보수 비트열로 설정한다.
op 이 &이면
result 를 lBits 와 rBits 에 비트 AND 연산을 적용한
결과로 설정한다.
그 외 op 이 ^이면
result 를 lBits 와 rBits 에 비트 XOR 연산을 적용한
결과로 설정한다.
그 외
Assert : op 은
|이다.
result 를 lBits 와 rBits 에 비트 OR 연산을 적용한 결과로
설정한다.
result 32비트 2의 보수 비트열이 나타내는 정수 의 Number
값 을 반환한다.
6.1.6.1.17 Number::bitwiseAND ( x , y )
추상 연산 Number::bitwiseAND는 인자 x (Number), y (Number)를 받고 정수(Number) 를 반환합니다. 호출 시 다음 단계를 수행합니다:
NumberBitwiseOp (&,
x , y )를 반환한다.
6.1.6.1.18 Number::bitwiseXOR ( x , y )
추상 연산 Number::bitwiseXOR는 인자 x (Number), y (Number)를 받고 정수(Number) 를 반환합니다. 호출 시 다음 단계를 수행합니다:
NumberBitwiseOp (^,
x , y )를 반환한다.
6.1.6.1.19 Number::bitwiseOR ( x , y )
추상 연산 Number::bitwiseOR는 인자 x (Number), y (Number)를 받고 정수(Number) 를 반환합니다. 호출 시 다음 단계를 수행합니다:
NumberBitwiseOp (|,
x , y )를 반환한다.
6.1.6.1.20 Number::toString ( x , radix
)
추상 연산 Number::toString은 인자 x (Number), radix (정수 , 포함
구간 2~36)을 받고 String을 반환합니다. x 를 radix 진법 위치
표기법(positional numeral system)으로 String으로 표현합니다. r 진법으로 수를 표현할 때 사용하는 숫자는
"0123456789abcdefghijklmnopqrstuvwxyz" 의 앞 r 코드 유닛을 순서대로
사용합니다. 크기가 1 𝔽 이상인 숫자의 표현에는 선행 0이 포함되지 않습니다. 호출 시 다음 단계를
수행합니다:
x 가 NaN 이면 "NaN" 반환
x 가 +0 𝔽 또는
-0 𝔽 이면 "0" 반환
x < -0 𝔽 이면 string-concatenation ("-" ,
Number::toString (-x ,
radix )) 반환
x 가 +∞ 𝔽 이면 "Infinity"
반환
n , k ,
s 를 정수 로 정한다. k ≥ 1이며,
radix k - 1 ≤ s <
radix k 이고, 𝔽 (s ×
radix n - k )가 x 이며,
k 는 최소가 되도록 한다. k 는 s 를 radix 로 표현할 때의
자릿수이며, s 는 radix 로 나누어떨어지지 않으며, 최하위 자릿수는 반드시 유일하게 결정되지는 않는다.
radix ≠ 10 또는 n 이 포함 구간 -5~21에 있으면
n ≥ k 이면
s 를 radix 로 표현한 k 자리 코드 유닛과,
n - k 개의 0x0030(DIGIT ZERO) 코드 유닛을
string-concatenation 하여
반환한다.
그 외 n > 0이면
s 를 radix 로 표현한 상위 n 자리 코드 유닛,
0x002E(FULL STOP) 코드 유닛, 나머지 k - n 자리 코드
유닛을 string-concatenation 하여
반환한다.
그 외
Assert : n ≤ 0.
0x0030(DIGIT ZERO), 0x002E(FULL STOP), -n 개의
0x0030(DIGIT ZERO), s 를 radix 로 표현한
k 자리 코드 유닛을 string-concatenation 하여
반환한다.
NOTE: 이 경우 입력은 1.2e+3과 같은 과학적 E 표기로 표현된다.
Assert :
radix 는 10이다.
n < 0이면
exponentSign 을 0x002D(HYPHEN-MINUS) 코드 유닛으로 설정한다.
그 외
exponentSign 을 0x002B(PLUS SIGN) 코드 유닛으로 설정한다.
k = 1이면
단일 자리 s 코드 유닛, 0x0065(LATIN SMALL LETTER E),
exponentSign , abs (n - 1)를 10진수로 표현한
코드 유닛을 string-concatenation 하여
반환한다.
상위 자리 s 의 10진수 코드 유닛, 0x002E(FULL STOP), 나머지 k - 1자리 10진수
코드 유닛, 0x0065(LATIN SMALL LETTER E), exponentSign , abs (n
- 1)를 10진수로 표현한 코드 유닛을 string-concatenation 하여 반환한다.
참고 1
다음 사항은 구현 가이드라인으로 유용할 수 있지만, 표준의 규범적 요구사항은 아닙니다:
x가 -0 𝔽 이 아닌 모든 Number 값이면, ToNumber (ToString (x))는 x와 같다.
s 의 최하위 자릿수는 5
단계의 요구조건에 따라 항상 유일하게 결정되지 않는다.
참고 2
규칙보다 더 정확한 변환을 제공하는 구현에서는 아래 대체 버전의 5 단계를
가이드라인으로 사용하는 것이 권장됩니다:
n , k , s 를 정수 로 정한다.
k ≥ 1, radix k - 1 ≤
s < radix k , 𝔽 (s ×
radix n - k )가 x 이며,
k 는 최소가 되도록 한다. s 의 후보가 여러 개일 경우, s ×
radix n - k 가 ℝ (x )에
가장 가까운 값을 s 로 선택한다. 두 후보가 있을 경우 짝수 값을 선택한다. k 는
s 를 radix 로 표현할 때의 자릿수이며, s 는
radix 로 나누어떨어지지 않는다.
참고 3
ECMAScript 구현자는 David M. Gay가 작성한 부동소수점 이진-10진 변환 관련 논문 및 코드를 참고할 수 있습니다:
Gay, David M. Correctly Rounded Binary-Decimal and Decimal-Binary Conversions.
Numerical Analysis, Manuscript 90-10. AT&T Bell Laboratories (Murray Hill,
New Jersey). 1990년 11월 30일.
https://ampl.com/_archive/first-website/REFS/rounding.pdf .
관련 코드: http://netlib.sandia.gov/fp/dtoa.c
및 http://netlib.sandia.gov/fp/g_fmt.c .
여러 netlib 미러 사이트에서도 찾을 수 있습니다.
6.1.6.2 BigInt 타입
BigInt 타입 은 정수 값을 나타냅니다.
값의 크기는 제한이 없으며, 특정 비트 폭에 국한되지 않습니다. 별도 언급이 없는 한, 연산은 일반적으로 정확한 수학적 결과를 제공합니다.
이진 연산에서는 BigInt가 2의 보수 이진 문자열로 동작하며, 음수는 왼쪽으로 무한히 비트가 설정된 것으로 취급됩니다.
6.1.6.2.1 BigInt::unaryMinus ( x )
추상 연산 BigInt::unaryMinus는 인자 x (BigInt)를 받고 BigInt를 반환합니다. 호출 시 다음 단계를 수행합니다:
x = 0 ℤ 이면
0 ℤ 를 반환한다.
-x 를 반환한다.
6.1.6.2.2 BigInt::bitwiseNOT ( x )
추상 연산 BigInt::bitwiseNOT는 인자 x (BigInt)를 받고 BigInt를 반환합니다. x 의 1의 보수
값을 반환합니다. 호출 시 다음 단계를 수행합니다:
-x - 1 ℤ 를 반환한다.
6.1.6.2.3 BigInt::exponentiate ( base ,
exponent )
추상 연산 BigInt::exponentiate는 인자 base (BigInt), exponent (BigInt)를 받고
정상 완료 BigInt 또는
예외 완료 를 반환합니다.
호출 시 다음 단계를 수행합니다:
exponent < 0 ℤ 이면
RangeError 예외를 던진다.
base = 0 ℤ 이고 exponent =
0 ℤ 이면 1 ℤ 를 반환한다.
base 를 exponent 거듭제곱한 값을 반환한다.
6.1.6.2.4 BigInt::multiply ( x , y )
추상 연산 BigInt::multiply는 인자 x (BigInt), y (BigInt)를 받고 BigInt를 반환합니다.
호출 시 다음 단계를 수행합니다:
x × y 를 반환한다.
참고
결과가 입력보다 훨씬 더 큰 비트폭을 갖더라도 정확한 수학적 결과가 반환됩니다.
6.1.6.2.5 BigInt::divide ( x , y )
추상 연산 BigInt::divide는 인자 x (BigInt), y (BigInt)를 받고
정상 완료 BigInt 또는
예외 완료 를 반환합니다.
호출 시 다음 단계를 수행합니다:
y = 0 ℤ 이면 RangeError
예외를 던진다.
quotient 를 ℝ (x ) / ℝ (y )로 설정한다.
ℤ (truncate (quotient ))를
반환한다.
6.1.6.2.6 BigInt::remainder ( n , d )
추상 연산 BigInt::remainder는 인자 n (BigInt), d (BigInt)를 받고
정상 완료 BigInt 또는
예외 완료 를 반환합니다.
호출 시 다음 단계를 수행합니다:
d = 0 ℤ 이면 RangeError
예외를 던진다.
n = 0 ℤ 이면
0 ℤ 를 반환한다.
quotient 를 ℝ (n ) / ℝ (d )로 설정한다.
q 를 ℤ (truncate (quotient ))로
설정한다.
n - (d × q )를 반환한다.
참고
결과의 부호는 피제수의 부호와 동일합니다.
6.1.6.2.7 BigInt::add ( x , y )
추상 연산 BigInt::add는 인자 x (BigInt), y (BigInt)를 받고 BigInt를 반환합니다. 호출 시
다음 단계를 수행합니다:
x + y 를 반환한다.
6.1.6.2.8 BigInt::subtract ( x , y )
추상 연산 BigInt::subtract는 인자 x (BigInt), y (BigInt)를 받고 BigInt를 반환합니다.
호출 시 다음 단계를 수행합니다:
x - y 를 반환한다.
6.1.6.2.9 BigInt::leftShift ( x , y )
추상 연산 BigInt::leftShift는 인자 x (BigInt), y (BigInt)를 받고 BigInt를 반환합니다.
호출 시 다음 단계를 수행합니다:
y < 0 ℤ 이면
ℤ (floor (ℝ (x )
/ 2-ℝ (y ) ))를 반환한다.
x × 2 ℤ y 를 반환한다.
참고
여기서 의미론은 BigInt를 무한 길이의 2의 보수 이진 문자열로 간주한 비트 시프트와 동일해야 합니다.
6.1.6.2.10 BigInt::signedRightShift ( x ,
y )
추상 연산 BigInt::signedRightShift는 인자 x (BigInt), y (BigInt)를 받고 BigInt를
반환합니다. 호출 시 다음 단계를 수행합니다:
BigInt::leftShift (x ,
-y )를 반환한다.
6.1.6.2.11 BigInt::unsignedRightShift ( x ,
y )
추상 연산 BigInt::unsignedRightShift는 인자 x (BigInt), y (BigInt)를 받고
예외 완료 를 반환합니다. 호출
시 다음 단계를 수행합니다:
TypeError 예외를 던진다.
6.1.6.2.12 BigInt::lessThan ( x , y )
추상 연산 BigInt::lessThan는 인자 x (BigInt), y (BigInt)를 받고 Boolean을 반환합니다.
호출 시 다음 단계를 수행합니다:
ℝ (x )
< ℝ (y )이면 true 반환,
아니면 false 반환
6.1.6.2.13 BigInt::equal ( x , y )
추상 연산 BigInt::equal는 인자 x (BigInt), y (BigInt)를 받고 Boolean을 반환합니다. 호출
시 다음 단계를 수행합니다:
ℝ (x ) =
ℝ (y )이면
true 반환, 아니면 false 반환
6.1.6.2.14 BinaryAnd ( x , y )
추상 연산 BinaryAnd는 인자 x (0 또는 1), y (0 또는 1)를 받고 0 또는 1을 반환합니다. 호출 시 다음
단계를 수행합니다:
x = 1이고 y = 1이면 1 반환
그 외에는 0 반환
6.1.6.2.15 BinaryOr ( x , y )
추상 연산 BinaryOr는 인자 x (0 또는 1), y (0 또는 1)를 받고 0 또는 1을 반환합니다. 호출 시 다음
단계를 수행합니다:
x = 1 또는 y = 1이면 1 반환
그 외에는 0 반환
6.1.6.2.16 BinaryXor ( x , y )
추상 연산 BinaryXor는 인자 x (0 또는 1), y (0 또는 1)를 받고 0 또는 1을 반환합니다. 호출 시 다음
단계를 수행합니다:
x = 1이고 y = 0이면 1 반환
그 외 x = 0이고 y = 1이면 1 반환
그 외에는 0 반환
6.1.6.2.17 BigIntBitwiseOp ( op , x ,
y )
추상 연산 BigIntBitwiseOp는 인자 op (&, ^,
|), x (BigInt), y (BigInt)를 받고 BigInt를 반환합니다. 호출 시 다음
단계를 수행합니다:
x 를 ℝ (x )로 설정한다.
y 를 ℝ (y )로 설정한다.
result 를 0으로 설정한다.
shift 를 0으로 설정한다.
반복, (x = 0 또는 x = -1)이고 (y = 0 또는 y
= -1)일 때까지
xDigit 를 x modulo 2로 설정한다.
yDigit 를 y modulo 2로 설정한다.
op 이 &이면
result 를 result +
2shift × BinaryAnd (xDigit ,
yDigit )로 설정한다.
그 외 op 이 |이면
result 를 result +
2shift × BinaryOr (xDigit ,
yDigit )로 설정한다.
그 외
Assert : op 은
^이다.
result 를 result +
2shift × BinaryXor (xDigit ,
yDigit )로 설정한다.
shift 를 shift + 1로 설정한다.
x 를 (x - xDigit ) / 2로 설정한다.
y 를 (y - yDigit ) / 2로 설정한다.
op 이 &이면
tmp 를 BinaryAnd (x
modulo 2, y
modulo 2)로 설정한다.
그 외 op 이 |이면
tmp 를 BinaryOr (x
modulo 2, y
modulo 2)로 설정한다.
그 외
Assert : op 은
^이다.
tmp 를 BinaryXor (x
modulo 2, y
modulo 2)로 설정한다.
tmp ≠ 0이면
result 를 result - 2shift 로
설정한다.
참고: 이 연산은 부호를 확장합니다.
BigInt value for
result 를 반환한다.
6.1.6.2.18 BigInt::bitwiseAND ( x , y )
추상 연산 BigInt::bitwiseAND는 인자 x (BigInt), y (BigInt)를 받고 BigInt를
반환합니다. 호출 시 다음 단계를 수행합니다:
BigIntBitwiseOp (&,
x , y )를 반환한다.
6.1.6.2.19 BigInt::bitwiseXOR ( x , y )
추상 연산 BigInt::bitwiseXOR는 인자 x (BigInt), y (BigInt)를 받고 BigInt를
반환합니다. 호출 시 다음 단계를 수행합니다:
BigIntBitwiseOp (^,
x , y )를 반환한다.
6.1.6.2.20 BigInt::bitwiseOR ( x , y )
추상 연산 BigInt::bitwiseOR는 인자 x (BigInt), y (BigInt)를 받고 BigInt를 반환합니다.
호출 시 다음 단계를 수행합니다:
BigIntBitwiseOp (|,
x , y )를 반환한다.
6.1.6.2.21 BigInt::toString ( x , radix
)
추상 연산 BigInt::toString은 인자 x (BigInt), radix (정수 , 포함
구간 2~36)을 받고 String을 반환합니다. x 를 radix 진법 위치
표기법으로 String으로 표현합니다. r 진법으로 BigInt를 표현할 때 사용하는 숫자는
"0123456789abcdefghijklmnopqrstuvwxyz" 의 앞 r 코드 유닛을 순서대로
사용합니다. 0 ℤ 이 아닌 BigInt의 표현에는 결코 선행 0이 포함되지 않습니다. 호출 시 다음 단계를
수행합니다:
x < 0 ℤ 이면 string-concatenation ("-" ,
BigInt::toString (-x ,
radix ))를 반환한다.
x 를 radix 로 표현한 String 값을 반환한다.
6.1.7 오브젝트 타입
각 Object 타입 인스턴스(간단히 “오브젝트”라
부름)는 프로퍼티의 집합을 나타냅니다.
각 프로퍼티는 데이터 프로퍼티 또는 접근자 프로퍼티입니다:
데이터 프로퍼티 는 키 값을 ECMAScript 언어 값 과 Boolean 속성 집합에
연결합니다.
접근자 프로퍼티 는 키 값을 하나 또는 두 개의 접근자 함수와
Boolean 속성 집합에 연결합니다. 접근자 함수는 해당 프로퍼티에 연결된 ECMAScript 언어 값 를
저장하거나 검색하는 데 사용됩니다.
오브젝트의 프로퍼티는 프로퍼티
키 를 사용하여 고유하게 식별됩니다. 프로퍼티 키 는
문자열(String) 또는 심볼(Symbol)입니다. 빈 문자열을 포함한 모든 문자열과 심볼은 프로퍼티 키 로 사용할 수 있습니다. 프로퍼티 이름 은 프로퍼티 키 중 문자열(String) 인 값입니다.
정수 인덱스 는
프로퍼티 이름
n 으로, CanonicalNumericIndexString (n )이
정수(Number) 를 포함 구간
+0 𝔽 ~ 𝔽 (253 - 1) 내에서 반환하는 경우를 의미합니다. 배열 인덱스 는 정수 인덱스
n 으로, CanonicalNumericIndexString (n )이
정수(Number) 를 포함 구간
+0 𝔽 ~ 𝔽 (232 - 2) 내에서 반환하는 경우를 의미합니다.
참고
모든 음이 아닌 안전
정수 는 해당하는 정수 인덱스 가 있습니다. 32비트 부호 없는 정수 중 232 - 1 을 제외한 모든 값은 해당하는 배열 인덱스 가
있습니다. "-0" 은 정수 인덱스 나 배열 인덱스 에 해당하지 않습니다.
프로퍼티 키 는 프로퍼티
및 그 값을 접근하는 데 사용됩니다. 프로퍼티 접근 방법에는 get (값 조회)과 set (값 할당)의 두 가지가 있습니다. get/set
접근으로 접근 가능한 프로퍼티에는 오브젝트의 자신의 프로퍼티(own properties) 와, 프로퍼티 상속 관계를 통해 다른 연관 객체가 제공하는
상속 프로퍼티(inherited properties) 가 포함됩니다. 상속 프로퍼티는 연관 객체의 own이나 inherited 프로퍼티일 수 있습니다. 한
오브젝트의 모든 own 프로퍼티는 서로 다른 키 값을 가져야 합니다.
모든 오브젝트는 논리적으로 프로퍼티의 집합이지만, 프로퍼티 접근 및 조작의 의미론에 따라 여러 형태의 오브젝트가 존재합니다. 다양한 오브젝트 형태에 대한 정의는
6.1.7.2 를 참고하세요.
또한 일부 오브젝트는 호출할 수 있습니다. 이들은 함수 또는 함수 오브젝트 라 부르며, 아래에서 더 자세히 설명합니다. ECMAScript의 모든
함수는 Object 타입의 멤버입니다.
6.1.7.1 프로퍼티 속성
속성은 이 명세에서 표 3 에 설명된 대로 객체 프로퍼티의 상태를
정의하고 설명하는 데 사용됩니다. 명시적으로 지정하지 않는 한, 각 속성의 초기값은 기본값(Default Value)입니다.
표 3: 객체 프로퍼티의 속성
속성 이름
해당 프로퍼티 타입
값의 도메인
기본값
설명
[[Value]]
데이터 프로퍼티
ECMAScript 언어
값
undefined
get 접근 시 프로퍼티에서 조회되는 값입니다.
[[Writable]]
데이터 프로퍼티
Boolean
false
false 일 경우, ECMAScript 코드에서 [[Set]] 으로 [[Value]] 속성을
변경하려 해도 성공하지 않습니다.
[[Get]]
접근자 프로퍼티
오브젝트 또는 undefined
undefined
값이 오브젝트 라면, 반드시 함수
오브젝트 여야 합니다. 함수의 [[Call]]
내부 메서드(표
5 )가 빈 인자 리스트로 호출되어, get 접근 시마다 프로퍼티 값을 반환합니다.
[[Set]]
접근자 프로퍼티
오브젝트 또는 undefined
undefined
값이 오브젝트 라면, 반드시 함수
오브젝트 여야 합니다. 함수의 [[Call]]
내부 메서드(표
5 )가 단일 인자로 할당값을 넘겨 호출되며, set 접근 시마다 실행됩니다. 프로퍼티의
[[Set]] 내부 메서드의 효과는, 이후 [[Get]] 내부 메서드 호출 결과에 영향을 줄 수도 있고, 주지 않을 수도
있습니다.
[[Enumerable]]
데이터 프로퍼티 또는 접근자 프로퍼티
Boolean
false
true 이면, for-in 반복문(14.7.5 )에
의해 열거됩니다. 그렇지 않으면, 해당 프로퍼티는 비열거형(non-enumerable)입니다.
[[Configurable]]
데이터 프로퍼티 또는 접근자 프로퍼티
Boolean
false
false 인 경우, 해당 프로퍼티를 삭제하거나, 데이터 프로퍼티 를 접근자 프로퍼티 로, 또는 반대로 변경하거나,
(기존 [[Value]] 교체나 [[Writable]] 을 false 로 변경하는 경우를
제외하고) 속성에 변경을 가하려 해도 실패합니다.
6.1.7.2 오브젝트 내부 메서드와 내부 슬롯
ECMAScript에서 오브젝트의 실제 의미론은 내부 메서드 라 불리는 알고리즘으로 지정됩니다. ECMAScript 엔진의 각 오브젝트는 런타임 동작을
정의하는 일련의 내부 메서드와 연관되어 있습니다. 이러한 내부 메서드는 ECMAScript 언어의 일부가 아니며, 명세상 설명 목적으로만 정의됩니다. 하지만
ECMAScript 구현 내의 각 오브젝트는 해당 내부 메서드가 명세한 대로 동작해야 합니다. 그 구현 방식은 구현체에 따라 다릅니다.
내부 메서드 이름은 다형적입니다. 즉, 동일한 내부 메서드 이름이 호출될 때 오브젝트 값에 따라 서로 다른 알고리즘이 실행될 수 있습니다. 내부 메서드가 호출되는 실제
오브젝트가 "타겟"입니다. 런타임 시 어떤 알고리즘이 오브젝트가 지원하지 않는 내부 메서드를 사용하려고 하면 TypeError
예외가 발생합니다.
내부 슬롯은 오브젝트와 연관된 내부 상태를 나타내며, 다양한 ECMAScript 명세 알고리즘에서 사용됩니다. 내부 슬롯은 오브젝트 프로퍼티가 아니며 상속되지도
않습니다. 내부 슬롯 명세에 따라 해당 상태는 ECMAScript 언어 타입 또는 명세 타입 값일 수
있습니다. 별도 명시가 없는 한, 내부 슬롯은 오브젝트 생성 과정에서 할당되며, 동적으로 추가될 수 없습니다. 별도 명시가 없는 한, 내부 슬롯의 초기값은
undefined 입니다. 명세의 다양한 알고리즘은 내부 슬롯이 있는 오브젝트를 생성합니다. 하지만 ECMAScript 언어
자체에서는 오브젝트에 내부 슬롯을 직접 연결할 방법이 없습니다.
모든 오브젝트는 [[PrivateElements]] 라는 내부 슬롯을 갖는데, 이는 List 타입의 PrivateElements 목록입니다.
이 List 는 해당 오브젝트의 private
필드, 메서드, 접근자의 값을 나타냅니다. 초기값은 빈 List 입니다.
내부 메서드와 내부 슬롯은 명세에서 [[ ]]로 감싸서 표기됩니다.
표 4 는 ECMAScript 코드로 생성하거나
조작할 수 있는 모든 오브젝트에 적용되는 필수 내부 메서드 를 요약합니다. 모든 오브젝트는 이 필수 내부 메서드의 알고리즘을 가져야 합니다. 그러나
모든 오브젝트가 반드시 동일한 알고리즘을 사용하는 것은 아닙니다.
일반 오브젝트 는 다음 조건을 모두
만족하는 오브젝트입니다:
표 4 에 나열된 내부 메서드에 대해,
10.1 에
정의된 메서드를 사용한다.
오브젝트에 [[Call]] 내부 메서드가 있으면, 10.2.1
또는 10.3.1
중 하나를 사용한다.
오브젝트에 [[Construct]] 내부 메서드가 있으면, 10.2.2
또는 10.3.2
중 하나를 사용한다.
이색 오브젝트(exotic object) 는
일반
오브젝트 가 아닌 오브젝트입니다.
이 명세는 오브젝트의 내부 메서드에 따라 다양한 이색 오브젝트 유형을 구분합니다. 어떤 오브젝트가 특정 종류의 이색 오브젝트 (예:
배열 이색
오브젝트 또는 바운드 함수 이색 오브젝트 등)와
동작상 동일하더라도 명세된 내부 메서드 모음을 모두 갖추지 않으면 그 종류로 인식되지 않습니다.
표 4 의 “시그니처(Signature)” 열 및
유사한 표들은 각 내부 메서드의 호출 패턴을 설명합니다. 호출 패턴에는 항상 괄호로 감싼 설명적 인자 이름들이 포함됩니다. 인자 이름이 ECMAScript 타입명과
같으면 해당 타입이어야 함을 의미합니다. 내부 메서드가 명시적으로 반환값을 가지면 인자 목록 뒤에 “→”와 반환 타입이 붙습니다. 이 시그니처에 쓰인 타입 이름은
6 절 정의에 다음 명칭이 추가된 것입니다.
“any ”는 ECMAScript 언어 타입 중 아무 값이나 올 수
있음을 의미합니다.
내부 메서드는 인자 외에도 항상 호출 타겟 오브젝트에 접근할 수 있습니다.
내부 메서드는 암시적으로 Completion Record 를
반환합니다. 이는 normal completion (호출
패턴에서 제시된 반환 타입 값을 감쌈) 또는 throw
completion 일 수 있습니다.
표 4: 필수 내부 메서드
내부 메서드
시그니처
설명
[[GetPrototypeOf]]
( ) → Object | Null
이 오브젝트의 상속 프로퍼티를 제공하는 오브젝트를 결정합니다. null 은 상속 프로퍼티가 없음을
의미합니다.
[[SetPrototypeOf]]
(Object | Null) → Boolean
이 오브젝트를 상속 프로퍼티를 제공하는 다른 오브젝트와 연결합니다. null 을 넘기면 상속
프로퍼티가 없음을 의미합니다. 연산이 성공하면 true , 실패하면
false 를 반환합니다.
[[IsExtensible]]
( ) → Boolean
이 오브젝트에 추가 프로퍼티를 추가할 수 있는지 여부를 결정합니다.
[[PreventExtensions]]
( ) → Boolean
이 오브젝트에 새 프로퍼티를 추가할 수 있는지 제어합니다. 연산이 성공하면 true , 실패하면
false 를 반환합니다.
[[GetOwnProperty]]
(propertyKey ) → Undefined | Property
Descriptor
이 오브젝트의 own 프로퍼티 중 propertyKey 를 키로 하는 프로퍼티에 대한 Property
Descriptor 를 반환하거나, 해당 프로퍼티가 없으면
undefined 를 반환합니다.
[[DefineOwnProperty]]
(propertyKey , PropertyDescriptor ) → Boolean
propertyKey 를 키로 하는 own 프로퍼티를 PropertyDescriptor 로
기술된 상태로 생성하거나 변경합니다. 성공하면 true , 아니면
false 를 반환합니다.
[[HasProperty]]
(propertyKey ) → Boolean
이 오브젝트에 propertyKey 를 키로 하는 own 또는 상속 프로퍼티가 있는지 Boolean 값으로
반환합니다.
[[Get]]
(propertyKey , Receiver ) → any
이 오브젝트에서 propertyKey 를 키로 하는 프로퍼티의 값을 반환합니다. 프로퍼티 값을 얻기 위해
ECMAScript 코드를 실행해야 하는 경우, Receiver 가 코드 평가 시
this 값으로 사용됩니다.
[[Set]]
(propertyKey , value , Receiver ) →
Boolean
propertyKey 에 해당하는 프로퍼티의 값을 value 로 설정합니다. 프로퍼티 값을
설정하기 위해 ECMAScript 코드를 실행해야 하는 경우, Receiver 가 코드 평가 시
this 값으로 사용됩니다. 설정에 성공하면 true ,
실패하면 false 를 반환합니다.
[[Delete]]
(propertyKey ) → Boolean
이 오브젝트에서 propertyKey 를 키로 하는 own 프로퍼티를 삭제합니다. 프로퍼티가 삭제되지 않고
여전히 존재하면 false 를 반환합니다. 프로퍼티가 삭제됐거나 존재하지 않으면
true 를 반환합니다.
[[OwnPropertyKeys]]
( ) → List
of property keys
이 오브젝트의 own 프로퍼티 키 전체를 요소로 갖는 List 를
반환합니다.
표
5 는 함수로 호출 가능한 오브젝트가 지원하는 추가 필수 내부 메서드를 요약합니다. 함수 오브젝트 는 [[Call]] 내부 메서드를 지원하는 오브젝트이고, 생성자 는 [[Construct]]
내부 메서드를 지원하는 오브젝트입니다. [[Construct]] 를 지원하는 모든 오브젝트는 반드시 [[Call]] 도 지원해야 합니다. 즉, 모든 생성자 는 함수
오브젝트 여야 합니다. 따라서 생성자 는 생성자 함수 또는 생성자
함수
오브젝트 라고도 부를 수 있습니다.
표 5: 함수 오브젝트의 추가 필수 내부 메서드
내부 메서드
시그니처
설명
[[Call]]
(any , List
of any ) → any
이 오브젝트와 연관된 코드를 실행합니다. 함수 호출 표현식으로 호출됩니다. 내부 메서드의 인자는
this 값과, 호출 표현식으로 함수에 전달된 인자를 요소로 갖는 List 입니다.
이 내부 메서드를 구현한 오브젝트는 호출 가능(callable) 합니다.
[[Construct]]
(List
of any , Object) → Object
오브젝트를 생성합니다. new 연산자나 super 호출을 통해 실행됩니다. 내부
메서드의 첫 번째 인자는 List 로,
생성자 호출 또는 super 호출의 인자들을 요소로 갖습니다. 두 번째 인자는
new 연산자가 처음 적용된 오브젝트입니다. 이 내부 메서드를 구현한 오브젝트를 생성자 라 합니다. 함수
오브젝트 가 반드시 생성자 인 것은 아니며,
[[Construct]] 내부 메서드가 없는 함수
오브젝트 도 있습니다.
일반
오브젝트 와 표준 이색 오브젝트 의 필수 내부 메서드의 의미론은 10 절에 명시되어 있습니다. 만약
이색
오브젝트 의 내부 메서드를 구현에서 지원하지 않는 경우, 해당 사용 시 TypeError
예외를 반드시 발생시켜야 합니다.
6.1.7.3 필수 내부 메서드의 불변 조건
ECMAScript 엔진의 오브젝트 내부 메서드는 아래에 명시된 불변 조건(invariant)을 반드시 준수해야 합니다. 이 명세의 일반 ECMAScript 오브젝트
및 모든 표준 이색
오브젝트 는 이러한 불변 조건을 유지합니다. ECMAScript Proxy 오브젝트는 [[ProxyHandler]] 오브젝트의 트랩(trap) 결과에 대한 런타임 검사를 통해 이 불변 조건을 유지합니다.
구현체가 제공하는 이색
오브젝트 도 반드시 이 불변 조건을 지켜야 합니다. 이러한 불변 조건이 위반되면 ECMAScript 코드에서 예측 불가한
동작이나 보안 문제가 발생할 수 있습니다. 단, 이 불변 조건 위반이 구현체의 메모리 안전성을 절대 해쳐서는 안 됩니다.
구현체는 필수 내부 메서드의 기능을 우회적으로 제공하여 이 불변 조건을 우회할 수 있게 해서는 안 됩니다.
정의(Definitions):
내부 메서드의 target 은 해당 내부 메서드가 호출되는 오브젝트입니다.
[[IsExtensible]] 내부 메서드가 false 를 반환하거나, [[PreventExtensions]] 내부 메서드가 true 를 반환한 경우 그
타겟은 비확장(non-extensible) 입니다.
존재하지 않는(non-existent) 프로퍼티란 비확장 타겟에 own 프로퍼티로 존재하지 않는 프로퍼티입니다.
SameValue 에 대한 참조는 SameValue
알고리즘의 정의에 따릅니다.
반환 값(Return value):
모든 내부 메서드의 반환 값은 다음 중 하나를 가지는 Completion
Record 여야 합니다:
[[Type]] = normal , [[Target]] = empty , [[Value]] = 해당 내부 메서드의 아래에 명시된 "정상 반환 타입(normal return type)"의 값
[[Type]] = throw , [[Target]] = empty , [[Value]] = 임의의 ECMAScript 언어
값
참고 1
[[GetPrototypeOf]] ( )
정상 반환 타입은 Object 또는 Null입니다.
타겟이 비확장이고 [[GetPrototypeOf]] 가 값 V 를 반환한 경우, 이후 모든
[[GetPrototypeOf]] 호출은 SameValue 로 V 와 동일한
값을 반환해야 합니다.
참고 2
오브젝트의 프로토타입 체인은 유한 길이를 가져야 합니다(즉, 어떤 오브젝트에서 시작해 [[GetPrototypeOf]] 내부 메서드를 재귀적으로 적용하면 결국
null 에 도달해야 함). 하지만 프로토타입 체인에 일반 오브젝트 의 정의를 따르지 않는
이색
오브젝트 가 포함되면 이 조건은 오브젝트 수준에서 강제할 수 없습니다. 이러한 순환 프로토타입 체인은 오브젝트
프로퍼티 접근 시 무한 루프를 야기할 수 있습니다.
[[SetPrototypeOf]] ( V )
정상 반환 타입은 Boolean입니다.
타겟이 비확장일 때, V 가 타겟의 관찰된 [[GetPrototypeOf]] 값과
SameValue 가 아닌 한 [[SetPrototypeOf]] 는 반드시 false 를 반환해야 합니다.
[[IsExtensible]] ( )
정상 반환 타입은 Boolean입니다.
[[IsExtensible]] 이 false 를 반환한 경우, 이후 해당 타겟의
모든 [[IsExtensible]] 호출은 false 를 반환해야 합니다.
[[PreventExtensions]] ( )
정상 반환 타입은 Boolean입니다.
[[PreventExtensions]] 이 true 를 반환한 경우, 이후 해당
타겟의 모든 [[IsExtensible]] 호출은 false 를 반환해야 하며,
타겟은 이제 비확장으로 간주합니다.
[[GetOwnProperty]] ( P )
정상 반환 타입은 Property
Descriptor 또는 Undefined입니다.
반환값이 Property
Descriptor 이면, 반드시 모든 필드가 채워진 Property
Descriptor 여야 합니다.
P 가 비설정 가능/비쓰기 가능 own 데이터 프로퍼티 로 기술된 경우, 이후의 모든 [[GetOwnProperty]] ( P ) 호출은 [[Value]] 가 P 의 [[Value]] 와
SameValue 인 Property
Descriptor 를 반환해야 합니다.
P 의 [[Writable]] 및 [[Value]]
이외의 속성이 변할 수 있거나, 프로퍼티가 삭제될 수 있다면 P 의 [[Configurable]] 속성은 true 여야 합니다.
[[Writable]] 속성이 false 에서
true 로 바뀔 수 있다면, [[Configurable]] 속성도
true 여야 합니다.
타겟이 비확장이고 P 가 존재하지 않는 own 프로퍼티라면, 이후의 모든 [[GetOwnProperty]] (P ) 호출은 P 를 존재하지 않는 것으로
설명해야 하며, 즉 [[GetOwnProperty]] (P )는
undefined 를 반환해야 합니다.
참고 3
세 번째 불변 조건의 결과로, 어떤 프로퍼티가 데이터 프로퍼티 로 기술되고 시간이 지남에 따라 다른 값을 반환할 수
있는 경우, 해당 프로퍼티의 [[Writable]] 이나 [[Configurable]] 속성, 또는 둘 다 true 여야 합니다.
비록 그 값을 바꿀 수 있는 메커니즘이 다른 필수 내부 메서드로 노출되어 있지 않더라도 말입니다.
[[DefineOwnProperty]] ( P , Desc )
정상 반환 타입은 Boolean입니다.
[[DefineOwnProperty]] 는 P 가 타겟의 비설정 가능 own 프로퍼티로 관찰된
적이 있다면, 아래 둘 중 하나가 아닌 한 반드시 false 를 반환해야 합니다:
P 가 쓰기 가능한 데이터 프로퍼티 이다. 비설정 가능 쓰기 가능한
데이터
프로퍼티 는 비설정 가능 비쓰기 가능한 데이터 프로퍼티 로 변경될 수 있다.
Desc 의 모든 속성이 P 의 속성과 SameValue 이다.
[[DefineOwnProperty]] (P , Desc )는 타겟이
비확장이면서 P 가 존재하지 않는 own 프로퍼티라면 반드시 false 를 반환해야 합니다. 즉, 비확장
타겟 오브젝트에는 새 프로퍼티를 추가할 수 없습니다.
[[HasProperty]] ( P )
정상 반환 타입은 Boolean입니다.
P 가 타겟의 비설정 가능 own 데이터 또는 접근자 프로퍼티 로 관찰된 적이 있다면, [[HasProperty]] 는 true 를 반환해야 합니다.
[[Get]] ( P , Receiver )
정상 반환 타입은 ECMAScript 언어 타입 중 임의의
값입니다.
P 가 값 V 를 가진 비설정 가능/비쓰기 가능 own 데이터 프로퍼티 로 관찰된 적이 있다면, [[Get]] 은 반드시 V 와 SameValue 인 값을 반환해야 합니다.
P 가 [[Get]] 속성이 undefined 인 비설정 가능
own 접근자
프로퍼티 로 관찰된 적이 있다면, [[Get]] 연산은 반드시
undefined 를 반환해야 합니다.
[[Set]] ( P , V , Receiver )
정상 반환 타입은 Boolean입니다.
P 가 비설정 가능/비쓰기 가능 own 데이터 프로퍼티 로 관찰된 적이 있다면, [[Set]] 은 V 가 P 의 [[Value]] 와 SameValue 인 경우를 제외하고 반드시
false 를 반환해야 합니다.
P 가 [[Set]] 속성이 undefined 인 비설정 가능
own 접근자
프로퍼티 로 관찰된 적이 있다면, [[Set]] 연산은 반드시
false 를 반환해야 합니다.
[[Delete]] ( P )
정상 반환 타입은 Boolean입니다.
P 가 타겟의 비설정 가능 own 데이터 또는 접근자 프로퍼티 로 관찰된 적이 있다면, [[Delete]] 는 false 를 반환해야 합니다.
[[OwnPropertyKeys]] ( )
정상 반환 타입은 List 입니다.
반환된 List 에는 중복 항목이 없어야
합니다.
반환된 List 의 각 요소는
프로퍼티
키 여야 합니다.
반환된 List 에는 이전에 관찰된 모든
비설정 가능 own 프로퍼티의 키가 반드시 포함되어야 합니다.
타겟이 비확장일 경우, 반환된 List 에는 [[GetOwnProperty]] 로 관찰 가능한 타겟의 모든 own 프로퍼티의 키만 포함되어야 합니다.
[[Call]] ( )
[[Construct]] ( )
정상 반환 타입은 Object입니다.
타겟은 [[Call]] 내부 메서드도 반드시 가지고 있어야 합니다.
6.1.7.4 잘 알려진 내장 객체
잘 알려진 내장 객체들은 이 명세의 알고리즘에 의해 명시적으로 참조되는 내장 객체들이며, 일반적으로 realm 별로 고유한 정체성을 가진다. 별도로 명시되지 않는 한, 각 내장
객체는 실제로는 각 realm 마다
유사한 객체 집합에 해당한다.
이 명세에서 %name%과 같은 참조는 현재 realm 에 연결된, 해당 name에 해당하는 내장 객체를 의미한다. %name.a.b%와 같은
참조는, ECMAScript 코드가 평가되기 전에 내장 객체 %name%의 "a" 속성의 값에서
"b" 속성을 접근한 것과 같다. 현재 realm 과 그 내장 객체들의 결정 방법은 9.4 에 설명되어 있다. 잘 알려진 내장 객체들의 목록은
표 6 에 나와 있다.
표 6: 잘 알려진 내장 객체
참고
6.2 ECMAScript 명세 타입
명세 타입은 ECMAScript 언어 구성 요소와 ECMAScript 언어 타입 의 의미를 설명하기 위해 알고리즘 내에서
사용되는 메타값에 해당한다. 명세 타입에는 Reference Record , List , Completion Record , Property Descriptor ,
Environment Record , Abstract
Closure , 그리고 Data Block 이 포함된다. 명세 타입 값은 명세상의 산출물로, ECMAScript 구현
내의 특정 엔티티에 반드시 대응하지는 않는다. 명세 타입 값은 ECMAScript 표현식 평가의 중간 결과를 설명하는 데 사용될 수 있지만, 이러한 값은 객체의 프로퍼티나
ECMAScript 언어 변수의 값으로 저장될 수 없다.
6.2.1 Enum 명세 타입
Enums 는 명세 내부에서만 사용되는 값으로, ECMAScript 코드에서는 직접적으로
관찰할 수 없다. Enum은 sans-serif 글꼴로 표기된다. 예를 들어, Completion Record 의 [[Type]] 필드는 normal ,
return , 또는 throw 와 같은 값을 가진다. Enum은 이름 외의 특징이 없다.
Enum의 이름은 단지 다른 Enum과 구분하기 위한 용도일 뿐이며, 사용법이나 문맥상의 의미를 암시하지 않는다.
6.2.2 List와 Record 명세 타입
List 타입은 new 표현식의 인수 리스트 평가( 13.3.8
참고), 함수 호출, 기타 값의 간단한 순서형 리스트가 필요한 알고리즘의 설명에 사용된다. List 타입의 값은 개별 값으로 구성된 리스트 요소들의 단순한 순서 시퀀스이다.
이 시퀀스의 길이는 임의일 수 있다. 리스트의 요소는 0부터 시작하는 인덱스로 임의 접근이 가능하다. 표기상의 편의를 위해 배열과 유사한 문법으로 List 요소에 접근할 수
있다. 예를 들어, arguments [2]는 List arguments 의 세 번째 요소를 의미한다.
알고리즘이 List의 요소를 순서 지정 없이 반복할 때, 사용되는 순서는 List의 요소 순서이다.
이 명세 내에서 표기상의 편의를 위해, 리터럴 문법으로 새 List 값을 표현할 수 있다. 예를 들어, « 1, 2 »는 두 개의 요소를 가지며 각각 특정 값으로 초기화된
List 값을 정의한다. 새로운 빈 List는 « »로 표현할 수 있다.
이 명세에서 "the list-concatenation of A ,
B , ..." (각 인수가 비어 있을 수도 있는 List임)은 각 인수의 요소(순서대로)를 연결한 새로운 List 값을 의미한다.
List of String에 대해 "sorted according to lexicographic code unit order "라는 문구는, 짧은 문자열의 길이만큼 각 코드 유닛의 숫자값으로 정렬하고,
모두 같으면 짧은 문자열을 긴 문자열보다 먼저 정렬함을 의미한다. 이는 IsLessThan 추상 연산에서 설명된다.
Record 타입은 이 명세의 알고리즘 내에서 데이터 집합을 설명하는 데 사용된다. Record
타입 값은 하나 이상의 이름 붙은 필드로 구성된다. 각 필드의 값은 ECMAScript 언어 값 또는 명세
값이다. 필드 이름은 항상 이중 대괄호로 감싸며, 예를 들어 [[Value]] 와 같다.
이 명세 내에서 표기상의 편의를 위해, 객체 리터럴과 유사한 문법으로 Record 값을 표현할 수 있다. 예를 들어, { [[Field1]] : 42, [[Field2]] :
false , [[Field3]] :
empty }는 세 개의 필드를 각각 특정 값으로 초기화한 Record 값을 정의한다. 필드 이름의 순서는 중요하지 않다.
명시적으로 나열되지 않은 필드는 존재하지 않는 것으로 간주한다.
명세 텍스트와 알고리즘에서는 점 표기법을 사용해 Record 값의 특정 필드를 참조할 수 있다. 예를 들어, 위에서 보인 record R에 대해 R.[[Field2]] 는 “R의 [[Field2]] 라는 이름의 필드”를 의미한다.
자주 사용되는 Record 필드 조합의 스키마는 이름을 붙일 수 있으며, 그 이름을 리터럴 Record 값에 접두사로 사용하여 특정 집합의 종류를 명확히 할 수 있다. 예:
PropertyDescriptor { [[Value]] : 42, [[Writable]] : false , [[Configurable]] : true }.
6.2.3 Set과 Relation 명세 타입
Set 타입은 메모리 모델 에서 사용하기 위한 비순서 요소의 집합을 설명하는 데 사용된다.
ECMAScript의 같은 이름을 가진 컬렉션 타입과는 다르다. 혼동을 피하기 위해, 이 명세에서는 ECMAScript 컬렉션의 인스턴스를 항상 "Set 객체"라고 부른다.
Set 타입의 값은 중복 없는 단순한 요소 집합이며, 요소를 추가하거나 제거할 수 있다. Set끼리는 합집합, 교집합, 차집합 연산이 가능하다.
Relation 타입은 Set에 대한 제약 조건을 설명하는 데 사용된다. Relation
타입의 값은 값 도메인에서의 순서쌍의 Set이다. 예를 들어, 이벤트에 대한 Relation은 이벤트 순서쌍의 집합이다. Relation R 과
R 의 값 도메인에 속한 두 값 a 와 b 에 대해, a R
b 는 순서쌍 (a , b )가 R 의 멤버임을 의미하는 약칭이다. Relation이 어떤 조건에
대해 최소 Relation 일 때, 이는 그 조건을 만족하는 가장 작은 Relation임을
의미한다.
strict partial order 는 Relation 값
R 이 다음 조건을 만족할 때를 말한다.
참고 1
위 두 속성은 각각 반사성 없음(irreflexivity)과 추이성(transitivity)이라 한다.
strict total order 는 Relation 값
R 이 다음 조건을 만족할 때를 말한다.
참고 2
위 세 속성은 각각 전체성(totality), 반사성 없음(irreflexivity), 추이성(transitivity)이라 한다.
6.2.4 완료 레코드 명세 타입
완료 레코드 명세 타입은 값의 런타임 전파와
break, continue, return, throw와 같이 비지역적 제어
흐름 전이를 수행하는 구문의 동작과 같은 제어 흐름을 설명하는 데 사용된다.
완료 레코드는 표 7 에 정의된 필드를 가진다.
표 7: 완료
레코드 필드
필드 이름
값
의미
[[Type]]
normal , break ,
continue , return , 또는
throw
발생한 완료의 타입.
[[Value]]
완료
레코드 가 아닌 임의의 값
생성된 값.
[[Target]]
문자열 또는 empty
지정된 제어 전이의 대상 레이블.
다음과 같은 축약 용어가 때때로 완료 레코드를 지칭하는 데 사용된다.
정상 완료 는 [[Type]] 값이 normal 인 모든 완료 레코드를 의미한다.
break 완료 는 [[Type]] 값이 break 인 모든 완료 레코드를 의미한다.
continue 완료 는 [[Type]] 값이 continue 인 모든 완료 레코드를 의미한다.
return 완료 는 [[Type]] 값이 return 인 모든 완료 레코드를 의미한다.
throw 완료 는 [[Type]] 값이 throw 인 모든 완료 레코드를 의미한다.
비정상 완료 는 [[Type]] 값이 normal 이 아닌 모든 완료 레코드를 의미한다.
특정 값이 포함된 정상 완료 는 [[Value]] 필드에 해당 타입의 값을 가진 정상 완료를 의미한다.
이 명세에서 정의된 호출 가능한 객체는 정상 완료 또는 throw 완료만 반환해야 한다. 그 외의 완료 레코드를 반환하는 것은 편집상의 오류로 간주된다.
구현
정의 호출 가능한 객체는 정상 완료 또는 throw 완료만 반환해야 한다.
6.2.4.1 NormalCompletion ( value )
추상 연산 NormalCompletion은 value (완료 레코드 가 아닌 임의의 값)를
인수로 받아 정상 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
완료 레코드 {
[[Type]] :
normal , [[Value]] : value ,
[[Target]] : empty }를 반환한다.
6.2.4.2 ThrowCompletion ( value )
추상 연산 ThrowCompletion은 value (ECMAScript 언어 값 )를
인수로 받아 throw 완료 를 반환한다. 호출 시
다음 단계를 수행한다:
완료 레코드 {
[[Type]] :
throw , [[Value]] : value ,
[[Target]] : empty }를 반환한다.
6.2.4.3 ReturnCompletion ( value )
추상 연산 ReturnCompletion은 value (ECMAScript 언어 값 )를
인수로 받아 return 완료 를 반환한다. 호출
시 다음 단계를 수행한다:
완료 레코드 {
[[Type]] :
return , [[Value]] : value ,
[[Target]] : empty }를 반환한다.
6.2.4.4 UpdateEmpty ( completionRecord ,
value )
추상 연산 UpdateEmpty는 completionRecord ( 완료 레코드 )와
value ( 완료
레코드 가 아닌 임의의 값 )를 인수로 받아 완료 레코드 를 반환한다. 호출 시
다음 단계를 수행한다:
Assert :
completionRecord 가 return 완료 또는
throw 완료 인
경우, completionRecord .[[Value]] 는
empty 가 아니어야 한다.
만약 completionRecord .[[Value]] 가
empty 가 아니라면, ? completionRecord 를 반환한다.
완료 레코드 {
[[Type]] :
completionRecord .[[Type]] , [[Value]] : value , [[Target]] : completionRecord .[[Target]] }를 반환한다.
6.2.5 Reference Record 명세 타입
Reference Record 타입은 delete,
typeof, 대입 연산자, super 키워드 및 기타 언어 기능의 동작을 설명하는 데 사용된다.
예를 들어, 대입의 왼쪽 피연산자는 Reference Record를 생성해야 한다.
Reference Record는 해석된 이름 또는 (아직 해석되지 않았을 수도 있는) 프로퍼티 바인딩이며, 그 필드는 표 8 에 정의되어 있다.
표 8: Reference Record
필드
Reference Record를 다루기 위해 이 명세에서 다음 추상 연산 들이 사용된다:
6.2.5.1 IsPropertyReference ( V )
추상 연산 IsPropertyReference는 인수 V ( Reference Record )를
받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
V .[[Base]] 가
unresolvable 이면 false 를 반환한다.
V .[[Base]] 가 Environment Record 이면
false 를, 아니면 true 를 반환한다.
6.2.5.2 IsUnresolvableReference ( V )
추상 연산 IsUnresolvableReference는 인수 V ( Reference Record )를
받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
V .[[Base]] 가
unresolvable 이면 true 를, 아니면
false 를 반환한다.
6.2.5.3 IsSuperReference ( V )
추상 연산 IsSuperReference는 인수 V ( Reference Record )를
받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
V .[[ThisValue]] 가 empty 가
아니면 true 를, 아니면 false 를 반환한다.
6.2.5.4 IsPrivateReference ( V )
추상 연산 IsPrivateReference는 인수 V ( Reference Record )를
받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
V .[[ReferencedName]] 이 Private
Name 이면 true 를, 아니면
false 를 반환한다.
6.2.5.5 GetValue ( V )
추상 연산 GetValue는 인수 V ( Reference
Record 또는 ECMAScript 언어 값
)를 받아 특정 값을 포함하는 정상 완료
ECMAScript 언어 값 또는 비정상 완료 중 하나를 반환한다.
호출 시 다음 단계를 수행한다:
V 가 Reference
Record 가 아니면 V 를 반환한다.
IsUnresolvableReference (V )
가 true 이면 ReferenceError 예외를 throw한다.
IsPropertyReference (V )
가 true 이면, 다음을 수행한다:
baseObj 를 ? ToObject (V .[[Base]] )로 설정한다.
IsPrivateReference (V )
가 true 이면, 다음을 수행한다:
? PrivateGet (baseObj ,
V .[[ReferencedName]] )를 반환한다.
V .[[ReferencedName]] 이 property
key 가 아니면, 다음을 수행한다:
V .[[ReferencedName]] 을
? ToPropertyKey (V .[[ReferencedName]] )로 설정한다.
? baseObj .[[Get]] (V .[[ReferencedName]] , GetThisValue (V ))를
반환한다.
그 외의 경우,
base 를 V .[[Base]] 로 설정한다.
Assert : base 는 Environment Record 여야
한다.
? base .GetBindingValue (V .[[ReferencedName]] , V .[[Strict]] )를 반환한다 (9.1 참고).
참고
3.a 단계에서 생성될 수 있는 객체는 위 추상 연산과
ordinary
object 의 [[Get]] 내부 메서드 외부에서는 접근할 수
없다. 구현체는 실제 객체 생성을 생략할 수 있다.
6.2.5.6 PutValue ( V , W )
추상 연산 PutValue는 인수 V ( Reference
Record 또는 ECMAScript 언어 값
)와 W ( ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
unused 또는 비정상
완료 를 반환한다. 호출 시 다음 단계를 수행한다:
V 가 Reference
Record 가 아니면 ReferenceError 예외를 throw한다.
IsUnresolvableReference (V )
가 true 이면, 다음을 수행한다:
V .[[Strict]] 가 true 이면
ReferenceError 예외를 throw한다.
globalObj 를 GetGlobalObject ()로 설정한다.
? Set (globalObj ,
V .[[ReferencedName]] , W ,
false )를 수행한다.
unused 를 반환한다.
IsPropertyReference (V )
가 true 이면, 다음을 수행한다:
baseObj 를 ? ToObject (V .[[Base]] )로 설정한다.
IsPrivateReference (V )
가 true 이면, 다음을 수행한다:
? PrivateSet (baseObj ,
V .[[ReferencedName]] ,
W )를 반환한다.
V .[[ReferencedName]] 이 property
key 가 아니면, 다음을 수행한다:
V .[[ReferencedName]] 을
? ToPropertyKey (V .[[ReferencedName]] )로 설정한다.
succeeded 를 ? baseObj .[[Set]] (V .[[ReferencedName]] , W , GetThisValue (V ))로
설정한다.
succeeded 가 false 이고 V .[[Strict]] 가 true 이면
TypeError 예외를 throw한다.
unused 를 반환한다.
그 외의 경우,
base 를 V .[[Base]] 로 설정한다.
Assert : base 는 Environment Record 여야
한다.
? base .SetMutableBinding (V .[[ReferencedName]] , W , V .[[Strict]] )를 반환한다 (9.1 참고).
참고
3.a 단계에서 생성될 수 있는 객체는 위 추상 연산과
ordinary
object 의 [[Set]] 내부 메서드 외부에서는 접근할 수
없다. 구현체는 실제 객체 생성을 생략할 수 있다.
6.2.5.7 GetThisValue ( V )
추상 연산 GetThisValue는 인수 V ( Reference Record )를
받아 ECMAScript 언어 값 을 반환한다. 호출 시 다음
단계를 수행한다:
Assert :
IsPropertyReference (V )
가 true 임을 보장한다.
IsSuperReference (V )
가 true 이면 V .[[ThisValue]] 를,
아니면 V .[[Base]] 를 반환한다.
6.2.5.8 InitializeReferencedBinding ( V , W
)
추상 연산 InitializeReferencedBinding은 인수 V ( Reference Record )와
W ( ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
unused 또는 비정상
완료 를 반환한다. 호출 시 다음 단계를 수행한다:
Assert :
IsUnresolvableReference (V )
가 false 임을 보장한다.
base 를 V .[[Base]] 로 설정한다.
Assert :
base 는 Environment Record 여야 한다.
? base .InitializeBinding(V .[[ReferencedName]] , W )를 반환한다.
6.2.5.9 MakePrivateReference ( baseValue ,
privateIdentifier )
추상 연산 MakePrivateReference는 인수 baseValue ( ECMAScript 언어 값 )와
privateIdentifier (문자열)을 받아 Reference Record 를
반환한다. 호출 시 다음 단계를 수행한다:
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 설정한다.
Assert :
privateEnv 가 null 이 아님을 보장한다.
privateName 을 ResolvePrivateIdentifier (privateEnv ,
privateIdentifier )로 설정한다.
다음과 같은 Reference
Record 를 반환한다: { [[Base]] :
baseValue , [[ReferencedName]] :
privateName , [[Strict]] :
true , [[ThisValue]] :
empty }.
6.2.6 프로퍼티 디스크립터 명세 타입
Property Descriptor 타입은 객체 프로퍼티 속성의 조작 및
구체화(reification)를 설명하는 데 사용된다. Property Descriptor는 0개 이상의 필드를 가진 Record 이며, 각 필드의 이름은 속성
이름이고 값은 6.1.7.1 에 명시된 해당 속성 값이다. 이 명세 내에서 리터럴
Property Descriptor 레코드의 태그로 사용되는 스키마 이름은 “PropertyDescriptor”이다.
Property Descriptor 값은 특정 필드의 존재 또는 사용에 따라 데이터 프로퍼티 디스크립터와 접근자 프로퍼티 디스크립터로 더 분류될 수 있다. 데이터 프로퍼티
디스크립터는 [[Value]] 또는 [[Writable]] 라는 이름의 필드가 포함된
것이다. 접근자 프로퍼티 디스크립터는 [[Get]] 또는 [[Set]] 라는 이름의
필드가 포함된 것이다. 어떤 Property Descriptor도 [[Enumerable]] 와 [[Configurable]] 라는 이름의 필드를 가질 수 있다. Property Descriptor 값은 데이터 프로퍼티
디스크립터이면서 접근자 프로퍼티 디스크립터일 수는 없지만, 둘 다 아닐 수는 있다(이 경우 일반 프로퍼티 디스크립터이다). 완전히 채워진
Property Descriptor 는 접근자 프로퍼티 디스크립터 또는 데이터 프로퍼티 디스크립터 중 하나이면서 표 3 에 명시된 모든 해당 필드를 가진 것이다.
Property Descriptor 값을 다루기 위해 이 명세에서는 다음 추상 연산 들이 사용된다:
6.2.6.1 IsAccessorDescriptor ( Desc )
추상 연산 IsAccessorDescriptor는 인수 Desc ( Property
Descriptor )를 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
Desc 에 [[Get]] 필드가 있으면 true 를
반환한다.
Desc 에 [[Set]] 필드가 있으면 true 를
반환한다.
false 를 반환한다.
6.2.6.2 IsDataDescriptor ( Desc )
추상 연산 IsDataDescriptor는 인수 Desc ( Property
Descriptor )를 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
Desc 에 [[Value]] 필드가 있으면 true 를
반환한다.
Desc 에 [[Writable]] 필드가 있으면
true 를 반환한다.
false 를 반환한다.
6.2.6.3 IsGenericDescriptor ( Desc )
추상 연산 IsGenericDescriptor는 인수 Desc ( Property
Descriptor )를 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
IsAccessorDescriptor (Desc )
가 true 이면 false 를 반환한다.
IsDataDescriptor (Desc )
가 true 이면 false 를 반환한다.
true 를 반환한다.
6.2.6.4 FromPropertyDescriptor ( Desc )
추상 연산 FromPropertyDescriptor는 인수 Desc ( Property
Descriptor 또는 undefined )를 받아 객체 또는
undefined 를 반환한다. 호출 시 다음 단계를 수행한다:
Desc 가 undefined 이면 undefined 를 반환한다.
obj 를 OrdinaryObjectCreate (%Object.prototype% )로
설정한다.
Assert :
obj 는 자체 프로퍼티가 없는 확장 가능한 ordinary object 여야 한다.
Desc 에 [[Value]] 필드가 있으면, 다음을 수행한다:
! CreateDataPropertyOrThrow (obj ,
"value" , Desc .[[Value]] )를 수행한다.
Desc 에 [[Writable]] 필드가 있으면, 다음을 수행한다:
! CreateDataPropertyOrThrow (obj ,
"writable" , Desc .[[Writable]] )를 수행한다.
Desc 에 [[Get]] 필드가 있으면, 다음을 수행한다:
! CreateDataPropertyOrThrow (obj ,
"get" , Desc .[[Get]] )를
수행한다.
Desc 에 [[Set]] 필드가 있으면, 다음을 수행한다:
! CreateDataPropertyOrThrow (obj ,
"set" , Desc .[[Set]] )를
수행한다.
Desc 에 [[Enumerable]] 필드가 있으면, 다음을 수행한다:
! CreateDataPropertyOrThrow (obj ,
"enumerable" , Desc .[[Enumerable]] )를 수행한다.
Desc 에 [[Configurable]] 필드가 있으면, 다음을 수행한다:
! CreateDataPropertyOrThrow (obj ,
"configurable" , Desc .[[Configurable]] )를 수행한다.
obj 를 반환한다.
6.2.6.5 ToPropertyDescriptor ( Obj )
추상 연산 ToPropertyDescriptor는 인수 Obj ( ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
Property
Descriptor 또는 throw 완료 를 반환한다. 호출 시
다음 단계를 수행한다:
Obj 가 객체가 아니면 , TypeError
예외를 throw한다.
desc 를 처음에는 필드가 없는 새로운 Property
Descriptor 로 설정한다.
hasEnumerable 을 ? HasProperty (Obj ,
"enumerable" )로 설정한다.
hasEnumerable 이 true 이면, 다음을 수행한다:
enumerable 을 ToBoolean (? Get (Obj ,
"enumerable" ))로 설정한다.
desc .[[Enumerable]] 에
enumerable 을 할당한다.
hasConfigurable 을 ? HasProperty (Obj ,
"configurable" )로 설정한다.
hasConfigurable 이 true 이면, 다음을 수행한다:
configurable 을 ToBoolean (? Get (Obj ,
"configurable" ))로 설정한다.
desc .[[Configurable]] 에
configurable 을 할당한다.
hasValue 를 ? HasProperty (Obj ,
"value" )로 설정한다.
hasValue 가 true 이면, 다음을 수행한다:
value 를 ? Get (Obj ,
"value" )로 설정한다.
desc .[[Value]] 에 value 를 할당한다.
hasWritable 을 ? HasProperty (Obj ,
"writable" )로 설정한다.
hasWritable 이 true 이면, 다음을 수행한다:
writable 을 ToBoolean (? Get (Obj ,
"writable" ))로 설정한다.
desc .[[Writable]] 에 writable 을
할당한다.
hasGet 을 ? HasProperty (Obj ,
"get" )로 설정한다.
hasGet 이 true 이면, 다음을 수행한다:
getter 를 ? Get (Obj ,
"get" )로 설정한다.
IsCallable (getter )
가 false 이고 getter 가
undefined 가 아니면 TypeError 예외를 throw한다.
desc .[[Get]] 에 getter 를 할당한다.
hasSet 을 ? HasProperty (Obj ,
"set" )로 설정한다.
hasSet 이 true 이면, 다음을 수행한다:
setter 를 ? Get (Obj ,
"set" )로 설정한다.
IsCallable (setter )
가 false 이고 setter 가
undefined 가 아니면 TypeError 예외를 throw한다.
desc .[[Set]] 에 setter 를 할당한다.
desc 에 [[Get]] 필드가 있거나 desc 에 [[Set]] 필드가 있으면, 다음을 수행한다:
desc 에 [[Value]] 필드가 있거나 desc 에
[[Writable]] 필드가 있으면 TypeError
예외를 throw한다.
desc 를 반환한다.
6.2.6.6 CompletePropertyDescriptor ( Desc )
추상 연산 CompletePropertyDescriptor는 인수 Desc ( Property
Descriptor )를 받아 unused 를 반환한다. 호출 시 다음 단계를
수행한다:
like 를 Record { [[Value]] : undefined , [[Writable]] : false , [[Get]] : undefined , [[Set]] : undefined , [[Enumerable]] : false , [[Configurable]] : false }로 설정한다.
IsGenericDescriptor (Desc )가
true 이거나 IsDataDescriptor (Desc )가
true 이면, 다음을 수행한다:
Desc 에 [[Value]] 필드가 없으면
Desc .[[Value]] 를 like .[[Value]] 로 설정한다.
Desc 에 [[Writable]] 필드가 없으면
Desc .[[Writable]] 를 like .[[Writable]] 로 설정한다.
그 외의 경우,
Desc 에 [[Get]] 필드가 없으면
Desc .[[Get]] 를 like .[[Get]] 로 설정한다.
Desc 에 [[Set]] 필드가 없으면
Desc .[[Set]] 를 like .[[Set]] 로 설정한다.
Desc 에 [[Enumerable]] 필드가 없으면
Desc .[[Enumerable]] 를 like .[[Enumerable]] 로 설정한다.
Desc 에 [[Configurable]] 필드가 없으면
Desc .[[Configurable]] 를 like .[[Configurable]] 로 설정한다.
unused 를 반환한다.
6.2.7 환경 레코드 명세 타입
Environment Record 타입은 중첩 함수와 블록에서의 이름 해석
동작을 설명하는 데 사용된다. 이 타입과 그에 대한 연산들은 9.1 에 정의되어 있다.
6.2.8 추상 클로저 명세 타입
Abstract Closure 명세 타입은 알고리즘 단계와 값들의 집합을 함께
참조하는 데 사용된다. Abstract Closure는 메타값이며, closure (arg1 , arg2 )와 같은
함수 호출 방식으로 호출된다. 추상
연산 과 마찬가지로, 호출 시 Abstract Closure에 명시된 알고리즘 단계를 수행한다.
Abstract Closure를 생성하는 알고리즘 단계에서는 "capture"라는 동사 뒤에 별칭(alias) 목록을 사용해 값을 캡처한다. Abstract Closure가
생성될 때, 각 별칭에 연결된 값을 그 시점에 캡처한다. Abstract Closure가 호출될 때 수행할 알고리즘을 명시하는 단계에서는, 캡처된 각 값은 해당 별칭을 통해
참조된다.
Abstract Closure가 Completion Record 를 반환하는
경우, 해당 Completion Record 는
정상 완료 또는 throw 완료 여야 한다.
Abstract Closure는 다음 예시처럼 다른 알고리즘의 일부로 인라인으로 생성된다.
addend 를 41로 한다.
closure 를 매개변수 (x )를 가지며 addend 를 캡처하고, 호출 시 다음 단계를 수행하는
새로운 Abstract Closure 로 한다:
x + addend 를 반환한다.
val 을 closure (1)로 한다.
Assert :
val 은 42이다.
6.2.9 데이터 블록
Data Block 명세 타입은 구분되는 변경 가능한 바이트 크기(8비트) 정수 값들의
시퀀스를 설명하는 데 사용된다. byte value 는 정수 이며, 구간 [0,
255] 에 속한다. Data Block 값은 고정된 개수의 바이트로 생성되며, 각 바이트의 초기값은 0이다.
이 명세 내 표기상의 편의를 위해, 배열과 유사한 문법을 사용해 Data Block 값의 개별 바이트에 접근할 수 있다. 이 표기법은 Data Block 값을 0부터 시작하는
정수-인덱스 바이트 시퀀스로 나타낸다. 예를 들어, db 가 5바이트 Data Block 값이면
db [2]는 세 번째 바이트를 의미한다.
여러 agent 에서 동시에 참조할 수 있는
메모리에 위치한 데이터 블록은 Shared Data Block 으로
지정된다. Shared Data Block은 정체성(동등성 판단 목적)을 주소와 무관하게 가진다: 이는 프로세스의 가상 주소가 아니라 그 블록이 대표하는
메모리 위치 집합에 묶여 있다. 두 데이터 블록이 동일하다는 것은 그들이 포함하는 위치 집합이 동일할 때뿐이다. 그렇지 않으면 서로 다르며, 각자 위치 집합의 교집합은
없다. 마지막으로 Shared Data Block은 일반 Data Block과 구별된다.
Shared Data Block의 의미는 Shared Data Block 이벤트 및 메모리 모델 에
의해 정의된다. 아래 추상 연산 들은 Shared Data Block 이벤트 를 도입하며, 평가 의미와
메모리 모델의 이벤트 의미를 연결하는 인터페이스 역할을 한다. 이벤트들은 candidate execution 을 구성하며,
메모리
모델 이 필터로 작동한다. 전체 의미는 메모리 모델 를 참조할 것.
Shared Data Block 이벤트 는 Record 로 모델링되며, 메모리 모델 에
정의되어 있다.
Data Block 값을 다루기 위해 이 명세에서는 다음 추상
연산 들이 사용된다:
6.2.9.1 CreateByteDataBlock ( size )
추상 연산 CreateByteDataBlock은 size (음이 아닌 정수 )를 인수로 받아, 특정 값을 포함하는 정상 완료
Data
Block 또는 throw
완료 를 반환한다. 호출 시 다음 단계를 수행한다:
size > 253 - 1이면 RangeError 예외를 throw한다.
db 를 size 바이트로 구성된 새로운 Data Block 값으로 한다. 만약
그런 Data
Block 의 생성을 할 수 없는 경우 RangeError 예외를
throw한다.
db 의 모든 바이트를 0으로 설정한다.
db 를 반환한다.
6.2.9.2 CreateSharedByteDataBlock ( size )
추상 연산 CreateSharedByteDataBlock은 size (음이 아닌 정수 )
를 인수로 받아, 특정 값을 포함하는 정상 완료
Shared Data
Block 또는 throw
완료 를 반환한다. 호출 시 다음 단계를 수행한다:
db 를 size 바이트로 구성된 새로운 Shared Data Block 값으로
한다. 그런 Shared Data Block 의 생성을 할 수 없는 경우
RangeError 예외를 throw한다.
execution 을 주변 agent 의 Agent
Record 의 [[CandidateExecution]] 필드로
한다.
eventsRecord 를 execution .[[EventsRecords]] 중 [[AgentSignifier]] 가 AgentSignifier ()인
Agent Events Record 로 한다.
zero 를 « 0 »으로 한다.
db 의 각 인덱스 i 에 대해, 다음을 수행한다:
WriteSharedMemory
{ [[Order]] : init , [[NoTear]] : true , [[Block]] : db , [[ByteIndex]] : i , [[ElementSize]] : 1, [[Payload]] : zero }를
eventsRecord .[[EventList]] 에 추가한다.
db 를 반환한다.
6.2.9.3 CopyDataBlockBytes ( toBlock ,
toIndex , fromBlock , fromIndex , count )
추상 연산 CopyDataBlockBytes는 인수 toBlock ( Data Block 또는 Shared Data
Block ), toIndex (음이 아닌 정수 ), fromBlock ( Data
Block 또는 Shared Data Block ), fromIndex (음이
아닌 정수 ),
count (음이 아닌 정수 )를 받아 unused 를 반환한다. 호출 시 다음
단계를 수행한다:
Assert :
fromBlock 과 toBlock 은 서로 다른 값이어야 한다.
fromSize 를 fromBlock 의 바이트 수로 한다.
Assert :
fromIndex + count ≤ fromSize 여야 한다.
toSize 를 toBlock 의 바이트 수로 한다.
Assert :
toIndex + count ≤ toSize 여야 한다.
count > 0인 동안 반복한다:
fromBlock 이 Shared Data Block 이면, 다음을
수행한다:
execution 을 주변
agent 의 Agent
Record 의 [[CandidateExecution]] 필드로 한다.
eventsRecord 를 execution .[[EventsRecords]] 중 [[AgentSignifier]] 가 AgentSignifier ()인
Agent Events
Record 로 한다.
bytes 를 List 로,
유일한 요소는 비결정적으로 선택된 byte
value 로 한다.
참고: 구현에서는 bytes 가 하드웨어의 비원자적 읽기 명령의 결과일 수 있다. 이 비결정성은
메모리 모델 의 의미 처방으로, 약한
일관성을 가진 하드웨어의 관찰 가능한 동작을 설명한다.
readEvent 를 ReadSharedMemory
{ [[Order]] :
unordered , [[NoTear]] :
true , [[Block]] :
fromBlock , [[ByteIndex]] :
fromIndex , [[ElementSize]] :
1 }로 한다.
readEvent 를 eventsRecord .[[EventList]] 에 추가한다.
Chosen Value
Record { [[Event]] :
readEvent , [[ChosenValue]] :
bytes }를 execution .[[ChosenValues]] 에 추가한다.
toBlock 이 Shared Data
Block 이면, 다음을 수행한다:
WriteSharedMemory
{ [[Order]] :
unordered , [[NoTear]] : true ,
[[Block]] : toBlock , [[ByteIndex]] : toIndex ,
[[ElementSize]] : 1, [[Payload]] : bytes }
를 eventsRecord .[[EventList]] 에 추가한다.
그 외의 경우,
toBlock [toIndex ]에 bytes [0]을
설정한다.
그 외의 경우,
Assert : toBlock 은
Shared Data Block 이
아니어야 한다.
toBlock [toIndex ]에
fromBlock [fromIndex ]를 설정한다.
toIndex 를 toIndex + 1로 한다.
fromIndex 를 fromIndex + 1로 한다.
count 를 count - 1로 한다.
unused 를 반환한다.
6.2.10 PrivateElement 명세 타입
PrivateElement 타입은 private 클래스 필드, 메서드, 접근자의 명세에 사용되는 Record 이다. Property Descriptor 는
private 요소에 사용되지 않지만, private 필드는 비구성, 비열거, 쓰기 가능한 데이터 프로퍼티 와 유사하게 동작하고, private 메서드는
비구성, 비열거, 쓰기 불가능한 데이터 프로퍼티 와 유사하며, private 접근자는 비구성, 비열거 접근자 프로퍼티 와
유사하게 동작한다.
PrivateElement 타입의 값은 Record 값이며, 그 필드는
표 9 에 정의되어 있다. 이러한 값은 PrivateElements 라 한다.
표 9: PrivateElement
필드
필드 이름
해당 필드가 존재하는 [[Kind]] 필드의 값
값
의미
[[Key]]
모두
Private Name
필드, 메서드, 접근자의 이름.
[[Kind]]
모두
field , method , 또는
accessor
요소의 종류.
[[Value]]
field 및 method
ECMAScript 언어 값
필드의 값.
[[Get]]
accessor
함수 객체 또는
undefined
private 접근자의 getter.
[[Set]]
accessor
함수 객체 또는
undefined
private 접근자의 setter.
6.2.11 ClassFieldDefinition Record 명세 타입
ClassFieldDefinition 타입은 클래스 필드 명세에 사용되는 Record 이다.
ClassFieldDefinition 타입의 값은 Record 값이며,
그 필드는 표 10 에 정의되어 있다. 이러한 값은 ClassFieldDefinition Record 라 한다.
표 10: ClassFieldDefinition
Record 필드
필드 이름
값
의미
[[Name]]
Private Name , 문자열, 또는
심볼
필드의 이름.
[[Initializer]]
ECMAScript 함수 객체 또는
empty
해당하는 경우, 필드의 이니셜라이저.
6.2.12 Private Name
Private Name 명세 타입은 전역적으로 고유한 값(다른 Private
Name과 구분되는 값, 비록 외견상 구별이 불가능하더라도)으로, private 클래스 요소(필드, 메서드, 접근자)의 키를 나타내는 데 사용된다. 각 Private
Name은 불변의 [[Description]] 을 가지며, 이는 문자열 값이다. Private Name은
PrivateFieldAdd 또는 PrivateMethodOrAccessorAdd 로 어떤
ECMAScript 객체에도 설치할 수 있으며, PrivateGet 과 PrivateSet 을 사용해 읽거나 쓸 수 있다.
6.2.13 ClassStaticBlockDefinition 레코드 명세 타입
ClassStaticBlockDefinition
Record 는 클래스 정적 초기화 블록의 실행 가능한 코드를 캡슐화하는 데 사용되는 Record 값이다.
ClassStaticBlockDefinition Record는 표 11 에 나열된 필드를 가진다.
표 11: ClassStaticBlockDefinition
Record 필드
필드 이름
값
의미
[[BodyFunction]]
ECMAScript 함수 객체
클래스의 정적 초기화 시 호출되는 함수 객체
7 추상 연산
이 연산들은 ECMAScript 언어의 일부가 아니며, 오직 ECMAScript 언어 의미의 명세를 돕기 위해 여기에 정의되어 있다. 다른, 더 특화된 추상 연산 들은 이 명세 전반에 걸쳐 정의되어
있다.
7.1 타입 변환
ECMAScript 언어는 필요에 따라 암시적으로 자동 타입 변환을 수행한다. 특정 구문의 의미를 명확히 하기 위해 일련의 변환 추상 연산 을 정의하는 것이 유용하다.
변환 추상 연산 들은 다형적이며, 어떤
ECMAScript 언어 타입 의 값도 인수로 받을 수 있다.
하지만 다른 명세 타입은 이 연산들과 함께 사용되지 않는다.
BigInt 타입 은 ECMAScript 언어에서
암시적 변환을 가지지 않는다. 프로그래머는 다른 타입의 값을 변환하려면 BigInt를 명시적으로 호출해야 한다.
7.1.1 ToPrimitive ( input [ , preferredType ]
)
추상 연산 ToPrimitive는 인수 input (ECMAScript 언어 값 )과 선택적
인수 preferredType (string 또는
number )을 받아, 특정 값을 포함하는 정상
완료 ECMAScript 언어 값 또는 throw 완료 를 반환한다. 이 연산은
input 인수를 Object 타입이 아닌 값으로 변환한다. 만약 객체가 둘 이상의 원시 타입으로 변환
가능하다면, 선택적 힌트 preferredType 을 사용해 그 타입을 우선시할 수 있다. 호출 시 다음 단계를 수행한다:
input 이 객체이면 , 다음을 수행한다:
exoticToPrim 를 ? GetMethod (input , %Symbol.toPrimitive% )로 한다.
exoticToPrim 이 undefined 가 아니면, 다음을 수행한다:
preferredType 이 없으면, 다음을 수행한다:
hint 를 "default" 로 한다.
그 외 preferredType 이 string 이면, 다음을 수행한다:
hint 를 "string" 로 한다.
그 외의 경우,
Assert :
preferredType 이 number 임을 보장한다.
hint 를 "number" 로 한다.
result 를 ? Call (exoticToPrim ,
input , « hint »)로 한다.
result 가 객체가 아니면 ,
result 를 반환한다.
TypeError 예외를 throw한다.
preferredType 이 없으면 preferredType 을
number 로 한다.
? OrdinaryToPrimitive (input ,
preferredType )를 반환한다.
input 을 반환한다.
참고
ToPrimitive가 힌트 없이 호출될 때 기본적으로 number 힌트로 동작한다. 그러나 객체는 %Symbol.toPrimitive% 메서드를 정의함으로써 이
동작을 오버라이드할 수 있다. 이 명세에서 정의된 객체 중 Date( 21.4.4.45 참고 )와
Symbol 객체( 20.4.3.5 참고 )만이
기본 ToPrimitive 동작을 오버라이드한다. Date는 힌트가 없을 때 string 으로 동작한다.
7.1.1.1 OrdinaryToPrimitive ( O , hint )
추상 연산 OrdinaryToPrimitive는 인수 O (객체)와 hint (string
또는 number )를 받아, 특정 값을 포함하는 정상 완료
ECMAScript 언어 값 또는 throw 완료 를 반환한다. 호출 시
다음 단계를 수행한다:
hint 가 string 이면, 다음을 수행한다:
methodNames 를 « "toString" ,
"valueOf" »로 한다.
그 외의 경우,
methodNames 를 « "valueOf" ,
"toString" »로 한다.
methodNames 의 각 요소 name 에 대해, 다음을 수행한다:
method 를 ? Get (O ,
name )로 한다.
IsCallable (method )
가 true 이면, 다음을 수행한다:
result 를 ? Call (method ,
O )로 한다.
result 가 객체가
아니면 , result 를 반환한다.
TypeError 예외를 throw한다.
7.1.2 ToBoolean ( argument )
추상 연산 ToBoolean은 인수 argument (ECMAScript 언어 값 )를 받아
Boolean을 반환한다. 이 연산은 argument 를 Boolean 타입 값으로 변환한다. 호출 시 다음 단계를 수행한다:
argument 가 Boolean이면 ,
argument 를 반환한다.
argument 가 undefined , null ,
+0 𝔽 , -0 𝔽 ,
NaN , 0 ℤ , 또는 빈 문자열 중 하나이면
false 를 반환한다.
참고: 이 단계는 B.3.6.1 절에서 대체된다.
true 를 반환한다.
7.1.3 ToNumeric ( value )
추상 연산 ToNumeric은 인수 value (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 Number
또는 BigInt, 또는 throw 완료 를 반환한다. 이 연산은
value 를 Number 또는 BigInt로 변환해 반환한다. 호출 시 다음 단계를 수행한다:
primValue 를 ? ToPrimitive (value ,
number )로 한다.
primValue 가 BigInt이면 ,
primValue 를 반환한다.
? ToNumber (primValue )를 반환한다.
7.1.4 ToNumber ( argument )
추상 연산 ToNumber는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 Number
또는 throw 완료 를 반환한다. 이 연산은
argument 를 Number 타입 값으로 변환한다. 호출 시 다음 단계를 수행한다:
argument 가 Number이면 ,
argument 를 반환한다.
argument 가 Symbol 또는 BigInt이면, TypeError 예외를 throw한다.
argument 가 undefined 이면 NaN 을 반환한다.
argument 가 null 또는 false 이면
+0 𝔽 을 반환한다.
argument 가 true 이면
1 𝔽 을 반환한다.
argument 가 문자열이면 ,
StringToNumber (argument )를
반환한다.
Assert :
argument 가 객체임 을 보장한다.
primValue 를 ? ToPrimitive (argument ,
number )로 한다.
Assert :
primValue 가 객체가 아님 을 보장한다.
? ToNumber (primValue )를 반환한다.
7.1.4.1 문자열 타입에 적용된 ToNumber
추상 연산 StringToNumber 는 다음 문법을 사용해 문자열 값을 Number
값으로 변환하는 방법을 명세한다.
구문
StringNumericLiteral
:::
StrWhiteSpace opt
StrWhiteSpace opt
StrNumericLiteral
StrWhiteSpace opt
StrWhiteSpace :::
StrWhiteSpaceChar
StrWhiteSpace opt
StrWhiteSpaceChar
:::
WhiteSpace
LineTerminator
StrNumericLiteral
:::
StrDecimalLiteral
NonDecimalIntegerLiteral [~Sep]
StrDecimalLiteral
:::
StrUnsignedDecimalLiteral
+
StrUnsignedDecimalLiteral
-
StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral
:::
Infinity
DecimalDigits [~Sep]
.
DecimalDigits [~Sep] opt
ExponentPart [~Sep] opt
.
DecimalDigits [~Sep]
ExponentPart [~Sep] opt
DecimalDigits [~Sep]
ExponentPart [~Sep] opt
위에 명시적으로 정의되지 않은 모든 문법 기호는 숫자 리터럴에 대한 어휘 문법(12.9.3 )에서 사용된 정의를
따른다.
참고
7.1.4.1.1 StringToNumber ( str )
추상 연산 StringToNumber는 인수 str (문자열)을 받아 Number를 반환한다. 호출 시 다음 단계를 수행한다:
literal 을 ParseText (str , StringNumericLiteral )로
한다.
literal 이 오류의
리스트 이면 NaN 을 반환한다.
literal 의 StringNumericValue 를
반환한다.
7.1.4.1.2 런타임 의미: StringNumericValue
구문 지시
연산 StringNumericValue는 인수를 받지 않고 Number를 반환한다.
참고
StringNumericLiteral 을
Number 값으로 변환하는 과정은 전체적으로 NumericValue 가 NumericLiteral 에
대해 결정되는 과정( 12.9.3 참고 )과 유사하지만,
세부 사항은 약간 다르다.
다음 생성 규칙별로 조각(piecewise) 정의된다:
StringNumericLiteral
::: StrWhiteSpace opt
+0 𝔽 을 반환한다.
StringNumericLiteral
:::
StrWhiteSpace opt
StrNumericLiteral
StrWhiteSpace opt
StrNumericLiteral 의 StringNumericValue 를
반환한다.
StrNumericLiteral
::: NonDecimalIntegerLiteral
𝔽 (MV of
NonDecimalIntegerLiteral )를
반환한다.
StrDecimalLiteral
:::
-
StrUnsignedDecimalLiteral
a 를 StrUnsignedDecimalLiteral 의
StringNumericValue 로
한다.
a 가 +0 𝔽 이면
-0 𝔽 을 반환한다.
-a 를 반환한다.
StrUnsignedDecimalLiteral
::: Infinity
+∞ 𝔽 을 반환한다.
StrUnsignedDecimalLiteral
:::
DecimalDigits
.
DecimalDigits opt
ExponentPart opt
첫 번째 DecimalDigits 의 MV를 a 로
한다.
두 번째 DecimalDigits 가 존재하면, 다음을 수행한다:
두 번째 DecimalDigits 의 MV를
b 로 한다.
두 번째 DecimalDigits 의 코드 포인트
개수를 n 으로 한다.
그 외의 경우,
b 를 0으로 한다.
n 을 0으로 한다.
ExponentPart 가
존재하면, e 를 ExponentPart 의 MV로 한다. 그렇지 않으면
e 를 0으로 한다.
RoundMVResult ((a +
(b × 10-n )) × 10e )를 반환한다.
StrUnsignedDecimalLiteral
:::
.
DecimalDigits
ExponentPart opt
DecimalDigits 의 MV를 b 로
한다.
ExponentPart 가
존재하면, e 를 ExponentPart 의 MV로 한다. 그렇지 않으면
e 를 0으로 한다.
DecimalDigits 의 코드 포인트 개수를
n 으로 한다.
RoundMVResult (b ×
10e - n )를 반환한다.
StrUnsignedDecimalLiteral
:::
DecimalDigits
ExponentPart opt
DecimalDigits 의 MV를 a 로
한다.
ExponentPart 가
존재하면, e 를 ExponentPart 의 MV로 한다. 그렇지 않으면
e 를 0으로 한다.
RoundMVResult (a ×
10e )를 반환한다.
7.1.4.1.3 RoundMVResult ( n )
추상 연산 RoundMVResult는 인수 n (수학적 값 )을 받아 Number를 반환한다.
이 연산은 n 을 구현 정의 방식으로 Number로 변환한다. 이 추상
연산에서, 숫자는 0이 아니거나 왼쪽에 0이 아닌 숫자가 있고 오른쪽에도 0이 아닌 숫자가 있을 때 유효 숫자(significant)로 간주한다. 이 추상
연산에서, "수학적 값 이 나타내는" 어떤 수학적
값 의 표현은 "수학적 값 의 10진수 표현"의 역이다. 호출 시 다음 단계를
수행한다:
n 의 10진수 표현이 20자리 이하의 유효 숫자를 가지면 𝔽 (n )를 반환한다.
option1 을 n 의 10진수 표현에서 20번째 이후의 유효 숫자를 0으로 바꾼 결과가 나타내는
수학적 값 로 한다.
option2 를 n 의 10진수 표현에서 20번째 이후의 유효 숫자를 0으로 바꾸고, 그 20번째
자릿수를(필요하다면 올림하면서) 1 증가시킨 결과가 나타내는 수학적 값 로 한다.
chosen 을 구현 정의 방식으로
option1 또는 option2 중에서 선택한다.
𝔽 (chosen )를 반환한다.
7.1.5 ToIntegerOrInfinity ( argument )
추상 연산 ToIntegerOrInfinity는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
정수 , +∞, 또는 -∞, 또는
throw 완료 를 반환한다. 이 연산은
argument 를 Number 값의 소수 부분을 잘라낸 정수 로 변환하거나, 해당 Number 값이 무한대일 경우 +∞ 또는 -∞로 변환한다. 호출 시 다음
단계를 수행한다:
number 를 ? ToNumber (argument )로 한다.
number 가 NaN ,
+0 𝔽 , 또는 -0 𝔽 중 하나이면 0을
반환한다.
number 가 +∞ 𝔽 이면 +∞를 반환한다.
number 가 -∞ 𝔽 이면 -∞를 반환한다.
truncate (ℝ (number ))를 반환한다.
참고
𝔽 (ToIntegerOrInfinity(
x ))는 어떤
x 에
대해서도
-0 𝔽 을 반환하지 않는다. 소수 부분의 절단은
x 를
수학적
값 으로 변환한 후 수행된다.
7.1.6 ToInt32 ( argument )
추상 연산 ToInt32는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
정수
Number 또는 throw 완료 를
반환한다. 이 연산은 argument 를 정수 Number 232 개 중 [-231 ,
231 -1] 구간 내의 값으로 변환한다. 호출 시 다음 단계를 수행한다:
number 를 ? ToNumber (argument )로 한다.
number 가 유한 이 아니거나 number 가
+0 𝔽 또는 -0 𝔽 이면
+0 𝔽 을 반환한다.
int 를 truncate (ℝ (number ))로 한다.
int32bit 를 int modulo 232 로 한다.
int32bit ≥ 231 이면 𝔽 (int32bit - 232 )를, 아니면
𝔽 (int32bit )를
반환한다.
참고
위 ToInt32 정의에 따라:
ToInt32 추상 연산은 멱등적이다: 그것이 생성한 결과에 다시 적용하면 값이 바뀌지 않는다.
ToInt32(ToUint32 (x ))는 모든
x 에 대해 ToInt32(x )와 같다. (+∞ 𝔽 와
-∞ 𝔽 이 +0 𝔽 으로 매핑되는 것은 이
속성을 보존하기 위함이다.)
ToInt32는 -0 𝔽 을 +0 𝔽 으로
매핑한다.
7.1.7 ToUint32 ( argument )
추상 연산 ToUint32는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
정수
Number 또는 throw 완료 를
반환한다. 이 연산은 argument 를 정수 Number 232 개 중 [+0,
232 -1] 구간 내의 값으로 변환한다. 호출 시 다음 단계를 수행한다:
number 를 ? ToNumber (argument )로 한다.
number 가 유한 이 아니거나 number 가
+0 𝔽 또는 -0 𝔽 이면
+0 𝔽 을 반환한다.
int 를 truncate (ℝ (number ))로 한다.
int32bit 를 int modulo 232 로 한다.
𝔽 (int32bit )를 반환한다.
참고
위 ToUint32 정의에 따라:
5 단계가 ToUint32와 ToInt32 의 유일한
차이점이다.
ToUint32 추상 연산은 멱등적이다: 그것이 생성한 결과에 다시 적용하면 값이 바뀌지 않는다.
ToUint32(ToInt32 (x ))는 모든 x 에
대해 ToUint32(x )와 같다. (+∞ 𝔽 와
-∞ 𝔽 이 +0 𝔽 으로 매핑되는 것은 이
속성을 보존하기 위함이다.)
ToUint32는 -0 𝔽 을 +0 𝔽 으로
매핑한다.
7.1.8 ToInt16 ( argument )
추상 연산 ToInt16은 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
정수
Number 또는 throw 완료 를
반환한다. 이 연산은 argument 를 정수 Number 216 개 중 [-215 ,
215 -1] 구간 내의 값으로 변환한다. 호출 시 다음 단계를 수행한다:
number 를 ? ToNumber (argument )로 한다.
number 가 유한 이 아니거나 number 가
+0 𝔽 또는 -0 𝔽 이면
+0 𝔽 을 반환한다.
int 를 truncate (ℝ (number ))로 한다.
int16bit 를 int modulo 216 로 한다.
int16bit ≥ 215 이면 𝔽 (int16bit - 216 )를, 아니면
𝔽 (int16bit )를
반환한다.
7.1.9 ToUint16 ( argument )
추상 연산 ToUint16은 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
정수
Number 또는 throw 완료 를
반환한다. 이 연산은 argument 를 정수 Number 216 개 중 [+0,
216 -1] 구간 내의 값으로 변환한다. 호출 시 다음 단계를 수행한다:
number 를 ? ToNumber (argument )로 한다.
number 가 유한 이 아니거나 number 가
+0 𝔽 또는 -0 𝔽 이면
+0 𝔽 을 반환한다.
int 를 truncate (ℝ (number ))로 한다.
int16bit 를 int modulo 216 로 한다.
𝔽 (int16bit )를
반환한다.
참고
위 ToUint16 정의에 따라:
4 단계의 216 대입만이 ToUint32 와
ToUint16의 유일한 차이점이다.
ToUint16은 -0 𝔽 을 +0 𝔽 으로
매핑한다.
7.1.10 ToInt8 ( argument )
추상 연산 ToInt8은 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
정수
Number 또는 throw 완료 를
반환한다. 이 연산은 argument 를 정수 Number 28 개 중 [-128,
127] 구간 내의 값으로 변환한다. 호출 시 다음 단계를 수행한다:
number 를 ? ToNumber (argument )로 한다.
number 가 유한 이 아니거나 number 가
+0 𝔽 또는 -0 𝔽 이면
+0 𝔽 을 반환한다.
int 를 truncate (ℝ (number ))로 한다.
int8bit 를 int modulo 28 로 한다.
int8bit ≥ 27 이면 𝔽 (int8bit - 28 )를, 아니면 𝔽 (int8bit )를 반환한다.
7.1.11 ToUint8 ( argument )
추상 연산 ToUint8은 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
정수
Number 또는 throw 완료 를
반환한다. 이 연산은 argument 를 정수 Number 28 개 중 [+0,
255] 구간 내의 값으로 변환한다. 호출 시 다음 단계를 수행한다:
number 를 ? ToNumber (argument )로 한다.
number 가 유한 이 아니거나 number 가
+0 𝔽 또는 -0 𝔽 이면
+0 𝔽 을 반환한다.
int 를 truncate (ℝ (number ))로 한다.
int8bit 를 int modulo 28 로 한다.
𝔽 (int8bit )를
반환한다.
7.1.12 ToUint8Clamp ( argument )
추상 연산 ToUint8Clamp는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
정수
Number 또는 throw 완료 를
반환한다. 이 연산은 argument 를 28 개의 정수 Number 값 중 [+0,
255] 구간 내로 클램프하고 반올림한다. 호출 시 다음 단계를 수행한다:
number 를 ? ToNumber (argument )로 한다.
number 가 NaN 이면
+0 𝔽 을 반환한다.
mv 를 number의 확장 수학적 값 으로 한다.
clamped 를 mv를 0과
255 사이로 클램프 한 결과로 한다.
f 를 floor (clamped )로 한다.
clamped < f + 0.5이면 𝔽 (f )를 반환한다.
clamped > f + 0.5이면 𝔽 (f + 1)을 반환한다.
f 가 짝수면 𝔽 (f )를, 아니면 𝔽 (f + 1)을 반환한다.
참고
다른 대부분의 ECMAScript 정수 변환 연산과 달리, ToUint8Clamp는 소수 값을 절단(truncate)하지
않고 반올림(round)한다. 또한 "홀수 올림(round half up)"이 아닌 "짝수 쪽으로 반올림(round half to even)" 타이브레이킹을
사용한다. 이는 Math.round 와 다르다.
7.1.13 ToBigInt ( argument )
추상 연산 ToBigInt는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 BigInt
또는 throw 완료 를 반환한다. 이 연산은
argument 를 BigInt 값으로 변환하거나, Number로의 암시적 변환이 필요한 경우 예외를 던진다. 호출 시 다음 단계를 수행한다:
prim 을 ? ToPrimitive (argument ,
number )로 한다.
prim 이 표 12 에서 어떤 값에 해당하는지에 따라 결과를 반환한다.
표 12: BigInt 변환
인수 타입
결과
Undefined
TypeError 예외를 throw한다.
Null
TypeError 예외를 throw한다.
Boolean
prim 이 true 면 1n,
false 면 0n을 반환한다.
BigInt
prim 을 반환한다.
Number
TypeError 예외를 throw한다.
String
n 을 StringToBigInt (prim )로
한다.
n 이 undefined 면
SyntaxError 예외를 throw한다.
n 을 반환한다.
Symbol
TypeError 예외를 throw한다.
7.1.14 StringToBigInt ( str )
추상 연산 StringToBigInt는 인수 str (문자열)을 받아 BigInt 또는 undefined 를 반환한다.
호출 시 다음 단계를 수행한다:
literal 을 ParseText (str , StringIntegerLiteral )로 한다.
literal 이 오류의
리스트 면 undefined 를 반환한다.
mv 를 literal 의 MV로 한다.
Assert :
mv 는 정수 여야 한다.
ℤ (mv )를 반환한다.
7.1.14.1 StringIntegerLiteral 문법
StringToBigInt 는 다음 문법을 사용한다.
구문
StringIntegerLiteral
:::
StrWhiteSpace opt
StrWhiteSpace opt
StrIntegerLiteral
StrWhiteSpace opt
StrIntegerLiteral
:::
SignedInteger [~Sep]
NonDecimalIntegerLiteral [~Sep]
7.1.14.2 런타임 의미: MV
7.1.15 ToBigInt64 ( argument )
추상 연산 ToBigInt64는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 BigInt
또는 throw 완료 를 반환한다. 이 연산은
argument 를 [-263 , 263 -1] 구간의
264 BigInt 값 중 하나로 변환한다. 호출 시 다음 단계를 수행한다:
n 을 ? ToBigInt (argument )로 한다.
int64bit 를 ℝ (n ) modulo 264 로 한다.
int64bit ≥ 263 이면 ℤ (int64bit - 264 )를, 아니면 ℤ (int64bit )를 반환한다.
7.1.16 ToBigUint64 ( argument )
추상 연산 ToBigUint64는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 BigInt
또는 throw 완료 를 반환한다. 이 연산은
argument 를 [0, 264 -1] 구간의 264
BigInt 값 중 하나로 변환한다. 호출 시 다음 단계를 수행한다:
n 을 ? ToBigInt (argument )로 한다.
int64bit 를 ℝ (n ) modulo 264 로 한다.
ℤ (int64bit )를
반환한다.
7.1.17 ToString ( argument )
추상 연산 ToString은 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 문자열 또는
throw 완료 를 반환한다. 이 연산은
argument 를 String 타입 값으로 변환한다. 호출 시 다음 단계를 수행한다:
argument 가 문자열 이면
argument 를 반환한다.
argument 가 심볼 이면
TypeError 예외를 throw한다.
argument 가 undefined 이면 "undefined" 를
반환한다.
argument 가 null 이면 "null" 를 반환한다.
argument 가 true 이면 "true" 를 반환한다.
argument 가 false 이면 "false" 를 반환한다.
argument 가 Number 이면
Number::toString (argument ,
10)을 반환한다.
argument 가 BigInt 이면
BigInt::toString (argument ,
10)을 반환한다.
Assert :
argument 가 객체임 을 보장한다.
primValue 를 ? ToPrimitive (argument ,
string )로 한다.
Assert :
primValue 가 객체가 아님 을 보장한다.
? ToString (primValue )를 반환한다.
7.1.18 ToObject ( argument )
추상 연산 ToObject는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 객체 또는
throw 완료 를 반환한다. 이 연산은
argument 를 표 13 에 따라 객체 타입 값으로 변환한다:
표 13: ToObject 변환
인수 타입
결과
Undefined
TypeError 예외를 throw한다.
Null
TypeError 예외를 throw한다.
Boolean
[[BooleanData]] 내부 슬롯이 argument 로 설정된 새로운
Boolean 객체를 반환한다. Boolean 객체에 대한 설명은 20.3 참고.
Number
[[NumberData]] 내부 슬롯이 argument 로 설정된 새로운
Number 객체를 반환한다. Number 객체에 대한 설명은 21.1 참고.
String
[[StringData]] 내부 슬롯이 argument 로 설정된 새로운
String 객체를 반환한다. String 객체에 대한 설명은 22.1 참고.
Symbol
[[SymbolData]] 내부 슬롯이 argument 로 설정된 새로운
Symbol 객체를 반환한다. Symbol 객체에 대한 설명은 20.4 참고.
BigInt
[[BigIntData]] 내부 슬롯이 argument 로 설정된 새로운
BigInt 객체를 반환한다. BigInt 객체에 대한 설명은 21.2 참고.
Object
argument 를 반환한다.
7.1.19 ToPropertyKey ( argument )
추상 연산 ToPropertyKey는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
프로퍼티 키 또는
throw 완료 를 반환한다. 이 연산은
argument 를 프로퍼티
키 로 사용할 수 있는 값으로 변환한다. 호출 시 다음 단계를 수행한다:
key 를 ? ToPrimitive (argument ,
string )로 한다.
key 가 심볼 이면, 다음을 수행한다:
key 를 반환한다.
! ToString (key )를 반환한다.
7.1.20 ToLength ( argument )
추상 연산 ToLength는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 음이 아닌
정수
Number 또는 throw 완료 를
반환한다. 이 연산은 argument 를 배열과 유사한 객체의 길이로 사용하기에 적합한 음이 아닌 정수 Number 로
클램프 및 절단한다. 호출 시 다음 단계를 수행한다:
len 을 ? ToIntegerOrInfinity (argument )로 한다.
len ≤ 0이면 +0 𝔽 을 반환한다.
𝔽 (min (len ,
253 - 1))를 반환한다.
7.1.21 CanonicalNumericIndexString ( argument )
추상 연산 CanonicalNumericIndexString는 인수 argument (문자열)를 받아 Number 또는
undefined 를 반환한다. argument 가 "-0" 이거나 어떤 Number 값
n 에 대해 ToString (n )과 정확히 일치하면, 해당 Number 값을 반환한다.
그렇지 않으면 undefined 를 반환한다. 호출 시 다음 단계를 수행한다:
argument 가 "-0" 이면
-0 𝔽 을 반환한다.
n 을 ! ToNumber (argument )로 한다.
! ToString (n )이 argument 와
같으면 n 을 반환한다.
undefined 를 반환한다.
표준 숫자 문자열(canonical numeric
string) 은 CanonicalNumericIndexString 추상 연산이 undefined 를 반환하지 않는 모든
문자열이다.
7.1.22 ToIndex ( value )
추상 연산 ToIndex는 인수 value (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 음이 아닌
정수 또는 throw 완료 를 반환한다. 이 연산은
value 를 정수 로
변환하고, 그 값이 음이 아니면서 정수
인덱스 에 해당하면 그 정수 를 반환한다. 그렇지 않으면 예외를 던진다. 호출 시 다음 단계를 수행한다:
integer 를 ? ToIntegerOrInfinity (value )로 한다.
integer 가 [0, 253 - 1] 구간에 없으면
RangeError 예외를 throw한다.
integer 를 반환한다.
7.2 테스트 및 비교 연산
7.2.1 RequireObjectCoercible ( argument )
추상 연산 RequireObjectCoercible는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
ECMAScript 언어 값 또는 throw 완료 를 반환한다. 이 연산은
argument 를 ToObject 를 통해 객체로 변환할 수 없을 경우 오류를 던진다. 표 14 에 정의되어 있다:
표 14: RequireObjectCoercible 결과
인수 타입
결과
Undefined
TypeError 예외를 throw한다.
Null
TypeError 예외를 throw한다.
Boolean
argument 를 반환한다.
Number
argument 를 반환한다.
String
argument 를 반환한다.
Symbol
argument 를 반환한다.
BigInt
argument 를 반환한다.
Object
argument 를 반환한다.
7.2.2 IsArray ( argument )
추상 연산 IsArray는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 Boolean
또는 throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
argument 가 객체가 아니면 false 를 반환한다.
argument 가 Array 이그조틱 객체 이면
true 를 반환한다.
argument 가 Proxy 이그조틱 객체 이면, 다음을 수행한다:
? ValidateNonRevokedProxy (argument )를
수행한다.
proxyTarget 을 argument .[[ProxyTarget]] 로 한다.
? IsArray (proxyTarget )를
반환한다.
false 를 반환한다.
7.2.3 IsCallable ( argument )
추상 연산 IsCallable은 인수 argument (ECMAScript 언어 값 )를 받아
Boolean을 반환한다. 이 연산은 argument 가 [[Call]] 내부 메서드를 가진 호출 가능한
함수인지 판단한다. 호출 시 다음 단계를 수행한다:
argument 가 객체가 아니면 false 를 반환한다.
argument 가 [[Call]] 내부 메서드를 가지고 있으면
true 를 반환한다.
false 를 반환한다.
7.2.4 IsConstructor ( argument )
추상 연산 IsConstructor는 인수 argument (ECMAScript 언어 값 )를 받아
Boolean을 반환한다. 이 연산은 argument 가 함수 객체 이면서 [[Construct]]
내부 메서드를 갖는지 판단한다. 호출 시 다음 단계를 수행한다:
argument 가 객체가 아니면 false 를 반환한다.
argument 가 [[Construct]] 내부 메서드를 가지고 있으면
true 를 반환한다.
false 를 반환한다.
7.2.5 IsExtensible ( O )
추상 연산 IsExtensible은 인수 O (객체)를 받아, 특정 값을 포함하는 정상 완료 Boolean
또는 throw 완료 를 반환한다. 이 연산은
O 에 추가 프로퍼티를 추가할 수 있는지 판단하는 데 사용된다. 호출 시 다음 단계를 수행한다:
? O .[[IsExtensible]] ()를 반환한다.
7.2.6 IsRegExp ( argument )
추상 연산 IsRegExp는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 Boolean
또는 throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
argument 가 객체가 아니면 false 를 반환한다.
matcher 를 ? Get (argument ,
%Symbol.match% )로 한다.
matcher 가 undefined 가 아니면, ToBoolean (matcher )를 반환한다.
argument 가 [[RegExpMatcher]] 내부 슬롯을 가지고 있으면
true 를 반환한다.
false 를 반환한다.
7.2.7 정적 의미: IsStringWellFormedUnicode (
string )
추상 연산 IsStringWellFormedUnicode는 인수 string (문자열)을 받아 Boolean을 반환한다. string 을
6.1.4 에서 설명된 대로 UTF-16
인코딩 코드 포인트의 시퀀스로 해석하고, 이것이 well formed 한
UTF-16 시퀀스인지 판단한다. 호출 시 다음 단계를 수행한다:
len 을 string 의 길이로 한다.
k 를 0으로 한다.
k < len 인 동안 반복한다:
cp 를 CodePointAt (string ,
k )로 한다.
cp .[[IsUnpairedSurrogate]] 가
true 이면 false 를 반환한다.
k 를 k + cp .[[CodeUnitCount]] 로 설정한다.
true 를 반환한다.
7.2.8 SameType ( x , y )
추상 연산 SameType은 인수 x (ECMAScript 언어 값 )와
y (ECMAScript 언어 값 )를 받아 Boolean을 반환한다.
두 인수가 동일한 타입인지 판별한다. 호출 시 다음 단계를 수행한다:
x 가 undefined 이고 y 가
undefined 이면 true 를 반환한다.
x 가 null 이고 y 가 null 이면
true 를 반환한다.
x 가 Boolean 이고
y 가 Boolean 이면
true 를 반환한다.
x 가 Number 이고
y 가 Number 이면
true 를 반환한다.
x 가 BigInt 이고
y 가 BigInt 이면
true 를 반환한다.
x 가 Symbol 이고
y 가 Symbol 이면
true 를 반환한다.
x 가 String 이고
y 가 String 이면
true 를 반환한다.
x 가 객체 이고 y 가 객체 이면 true 를 반환한다.
false 를 반환한다.
7.2.9 SameValue ( x , y )
추상 연산 SameValue는 인수 x (ECMAScript 언어 값 )와
y (ECMAScript 언어 값 )를 받아 Boolean을 반환한다.
두 인수가 같은 값인지 판단한다. 호출 시 다음 단계를 수행한다:
SameType (x , y )가
false 이면 false 를 반환한다.
x 가 Number 이면, 다음을
수행한다:
Number::sameValue (x ,
y )를 반환한다.
SameValueNonNumber (x ,
y )를 반환한다.
참고
이 알고리즘은 IsStrictlyEqual 알고리즘과는 모든
NaN 값을 동일하게 취급하고 +0 𝔽 과
-0 𝔽 을 구분한다는 점에서 다르다.
7.2.10 SameValueZero ( x , y )
추상 연산 SameValueZero는 인수 x (ECMAScript 언어 값 )와
y (ECMAScript 언어 값 )를 받아 Boolean을 반환한다.
두 인수가 같은 값인지 판단하되, +0 𝔽 과 -0 𝔽 의 차이를
무시한다. 호출 시 다음 단계를 수행한다:
SameType (x , y )가
false 이면 false 를 반환한다.
x 가 Number 이면, 다음을
수행한다:
Number::sameValueZero (x ,
y )를 반환한다.
SameValueNonNumber (x ,
y )를 반환한다.
참고
SameValueZero는 SameValue 와 다르게
+0 𝔽 과 -0 𝔽 을 동일하게 취급한다.
7.2.11 SameValueNonNumber ( x , y )
추상 연산 SameValueNonNumber는 인수 x (ECMAScript 언어 값 ,
Number 제외)와 y (ECMAScript 언어 값 , Number 제외)를 받아
Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
Assert :
SameType (x , y )가
true 임을 보장한다.
x 가 undefined 또는 null 이면
true 를 반환한다.
x 가 BigInt 이면, 다음을
수행한다:
BigInt::equal (x ,
y )를 반환한다.
x 가 String 이면, 다음을
수행한다:
x 와 y 가 길이가 같고 모든 위치의 코드 유닛이 같으면 true 를,
그렇지 않으면 false 를 반환한다.
x 가 Boolean 이면, 다음을
수행한다:
x 와 y 가 모두 true 이거나 모두
false 이면 true 를, 그렇지 않으면
false 를 반환한다.
참고: 다른 모든 ECMAScript 언어 값 은
동일성(identity)으로 비교한다.
x 가 y 와 동일하면 true 를, 그렇지 않으면
false 를 반환한다.
참고 1
설명 목적으로 일부 경우가 불필요하게 별도로 처리되어 있다.
참고 2
"
x 가
y 와 동일하다"의 구체적인 의미는
5.2.7 에 자세히 설명되어 있다.
7.2.12 IsLessThan ( x , y , LeftFirst
)
추상 연산 IsLessThan은 인수 x (ECMAScript 언어 값 ),
y (ECMAScript 언어 값 ),
LeftFirst (Boolean)을 받아,
특정 값을 포함하는 정상 완료 Boolean
또는 undefined , 또는 throw 완료 를
반환한다. 이 연산은 비교 x < y 의 의미를 제공하며, true ,
false , undefined (피연산자 중 하나 이상이 NaN 인
경우)을 반환한다. LeftFirst 플래그는 x 와 y 에 부수 효과가 있을 수 있을 때 연산의 순서를 제어하는 데
사용된다. 호출 시 다음 단계를 수행한다:
LeftFirst 가 true 이면, 다음을 수행한다:
px 를 ? ToPrimitive (x ,
number )로 한다.
py 를 ? ToPrimitive (y ,
number )로 한다.
그 외의 경우:
참고: 평가 순서를 유지하기 위해 평가 순서를 반대로 한다.
py 를 ? ToPrimitive (y ,
number )로 한다.
px 를 ? ToPrimitive (x ,
number )로 한다.
px 가 문자열 이고
py 가 문자열 이면, 다음을
수행한다:
lx 를 px 의 길이로 한다.
ly 를 py 의 길이로 한다.
0 ≤ i < min (lx , ly )인 모든
정수
i 에 대해, 오름차순으로 다음을 수행한다:
cx 를 px 의 인덱스 i 에 있는 코드 유닛의 숫자 값으로 한다.
cy 를 py 의 인덱스 i 에 있는 코드 유닛의 숫자 값으로 한다.
cx < cy 이면 true 를 반환한다.
cx > cy 이면 false 를 반환한다.
lx < ly 이면 true 를, 아니면
false 를 반환한다.
그 외의 경우:
px 가 BigInt 이고
py 가 문자열 이면,
다음을 수행한다:
ny 를 StringToBigInt (py )로
한다.
ny 가 undefined 이면
undefined 를 반환한다.
BigInt::lessThan (px ,
ny )를 반환한다.
px 가 문자열 이고
py 가 BigInt 이면,
다음을 수행한다:
nx 를 StringToBigInt (px )로
한다.
nx 가 undefined 이면
undefined 를 반환한다.
BigInt::lessThan (nx ,
py )를 반환한다.
참고: px 와 py 는 원시값이므로 평가 순서는 중요하지 않다.
nx 를 ? ToNumeric (px )로 한다.
ny 를 ? ToNumeric (py )로 한다.
SameType (nx ,
ny )가 true 이면, 다음을 수행한다:
nx 가 Number 이면,
다음을 수행한다:
Number::lessThan (nx ,
ny )를 반환한다.
그 외의 경우:
Assert : nx 가
BigInt 임을
보장한다.
BigInt::lessThan (nx ,
ny )를 반환한다.
Assert :
nx 가 BigInt 이고
ny 가 Number 이거나,
nx 가 Number 이고
ny 가 BigInt 임을
보장한다.
nx 또는 ny 가 NaN 이면
undefined 를 반환한다.
nx 가 -∞ 𝔽 이거나 ny 가
+∞ 𝔽 이면 true 를 반환한다.
nx 가 +∞ 𝔽 이거나 ny 가
-∞ 𝔽 이면 false 를 반환한다.
ℝ (nx )
< ℝ (ny )이면 true 를,
아니면 false 를 반환한다.
참고 1
3 단계는 1.c ( 13.15.3 )에서 논리합 대신
논리곱을 사용한다는 점에서 다르다.
참고 2
문자열의 비교는 UTF-16 코드 유닛의 시퀀스에 대한 단순한 사전식(lexicographic) 정렬을 사용한다. 유니코드 명세에 정의된 문자/문자열 동등성 및
정렬 순서의 더 복잡하고 의미론적인 정의는 사용하지 않는다. 따라서 유니코드 표준에서 정규적으로 동등하지만 정규화 형식이 다른 String 값은 같지 않다고
판정될 수 있다. 또한, 코드 유닛 기준 사전식 정렬은 서러게이트 쌍 이 포함된 문자열의 코드 포인트 기준 정렬과 다를 수 있다.
7.2.13 IsLooselyEqual ( x , y )
추상 연산 IsLooselyEqual는 인수 x (ECMAScript 언어 값 )와
y (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 Boolean
또는 throw 완료 를 반환한다. 이 연산은
== 연산자의 의미를 제공한다. 호출 시 다음 단계를 수행한다:
SameType (x , y )가
true 면, 다음을 수행한다:
IsStrictlyEqual (x ,
y )를 반환한다.
x 가 null 이고 y 가 undefined 이면
true 를 반환한다.
x 가 undefined 이고 y 가 null 이면
true 를 반환한다.
참고: 이 단계는 B.3.6.2 절에서 대체된다.
x 가 Number 이고
y 가 String 이면,
! IsLooselyEqual (x ,
! ToNumber (y ))를 반환한다.
x 가 String 이고
y 가 Number 이면,
! IsLooselyEqual (! ToNumber (x ), y )를 반환한다.
x 가 BigInt 이고
y 가 String 이면, 다음을
수행한다:
n 을 StringToBigInt (y )로
한다.
n 이 undefined 이면 false 를 반환한다.
! IsLooselyEqual (x ,
n )을 반환한다.
x 가 String 이고
y 가 BigInt 이면,
! IsLooselyEqual (y ,
x )를 반환한다.
x 가 Boolean 이면,
! IsLooselyEqual (!
ToNumber (x ), y )를 반환한다.
y 가 Boolean 이면,
! IsLooselyEqual (x ,
! ToNumber (y ))를 반환한다.
x 가 String, Number, BigInt, Symbol 중 하나이고 y 가 객체 이면, ! IsLooselyEqual (x ,
? ToPrimitive (y ))를 반환한다.
x 가 객체 이고 y 가 String, Number,
BigInt, Symbol 중 하나이면, ! IsLooselyEqual (?
ToPrimitive (x ), y )를
반환한다.
x 가 BigInt 이고
y 가 Number 이거나,
x 가 Number 이고
y 가 BigInt 이면, 다음을
수행한다:
x 가 유한 이 아니거나 y 가 유한 이 아니면
false 를 반환한다.
ℝ (x )
= ℝ (y )이면 true 를, 아니면
false 를 반환한다.
false 를 반환한다.
7.2.14 IsStrictlyEqual ( x , y )
추상 연산 IsStrictlyEqual은 인수 x (ECMAScript 언어 값 )와
y (ECMAScript 언어 값 )를 받아 Boolean을 반환한다.
이 연산은 === 연산자의 의미를 제공한다. 호출 시 다음 단계를 수행한다:
SameType (x , y )가
false 이면 false 를 반환한다.
x 가 Number 이면, 다음을
수행한다:
Number::equal (x ,
y )를 반환한다.
SameValueNonNumber (x ,
y )를 반환한다.
참고
이 알고리즘은 부호 있는 0과 NaN 처리에서 SameValue 알고리즘과 다르다.
7.3 객체에 대한 연산
7.3.1 MakeBasicObject ( internalSlotsList )
추상 연산 MakeBasicObject는 인수 internalSlotsList (내부 슬롯 이름의 List )를 받아 객체를 반환한다. 이는
일반
객체 와 특수 객체 를 포함하여 알고리즘적으로 생성되는 모든 ECMAScript 객체의 근원이다. 이는
모든 객체 생성에 사용되는 공통 단계를 분리하고 객체 생성을 중앙 집중화한다. 호출 시 다음 단계를 수행한다:
internalSlotsList 를 internalSlotsList 와 « [[PrivateElements]] »의 list-concatenation 으로
설정한다.
obj 를 internalSlotsList 의 각 이름에 대해 내부 슬롯을 가지는 새로 생성된 객체로 한다.
참고: 객체 내부 메서드 및
내부 슬롯 에 설명된 바와 같이, 각 내부 슬롯의 초기 값은 별도로 명시되지 않는 한
undefined 이다.
obj .[[PrivateElements]] 를 새로운 빈 List 로 설정한다.
obj 의 필수 내부 메서드를 일반 객체 에 10.1 에
명시된 기본 정의로 설정한다.
Assert : 호출자가
obj 의 [[GetPrototypeOf]] 와 [[SetPrototypeOf]] 필수 내부 메서드를 모두 재정의하지 않는 경우,
internalSlotsList 는 [[Prototype]] 을 포함한다.
Assert : 호출자가
obj 의 [[SetPrototypeOf]] , [[IsExtensible]] , [[PreventExtensions]]
필수 내부 메서드를 모두 재정의하지 않는 경우, internalSlotsList 는 [[Extensible]] 을 포함한다.
internalSlotsList 에 [[Extensible]] 가 포함되어 있으면
obj .[[Extensible]] 를 true 로 설정한다.
obj 를 반환한다.
참고
이 명세 내에서 특수
객체 는 추상 연산
(ArrayCreate , BoundFunctionCreate 등)에서 먼저
MakeBasicObject를 호출해 기본 객체를 얻고, 그 후에 해당 객체의 일부 또는 전체 내부 메서드를 재정의함으로써 생성된다. 특수 객체 생성을
캡슐화하기 위해, 객체의 필수 내부 메서드는 이러한 연산 외부에서 변경되지 않는다.
7.3.2 Get ( O , P )
추상 연산 Get은 인수 O (객체), P (프로퍼티 키 )를 받아,
특정 값을 포함하는 정상 완료
ECMAScript 언어 값 또는 throw 완료 를 반환한다. 이 연산은
객체의 특정 프로퍼티 값을 조회할 때 사용된다. 호출 시 다음 단계를 수행한다:
? O .[[Get]] (P , O )를 반환한다.
7.3.3 GetV ( V , P )
추상 연산 GetV는 인수 V (ECMAScript 언어 값 ),
P (프로퍼티
키 )를 받아,
특정 값을 포함하는 정상 완료
ECMAScript 언어 값 또는 throw 완료 를 반환한다. 이 연산은
ECMAScript 언어 값 의 특정 프로퍼티 값을 조회할 때
사용된다. 만약 값이 객체가 아니면, 해당 타입에 맞는 래퍼 객체를 사용해 프로퍼티 조회를 수행한다. 호출 시 다음 단계를 수행한다:
O 를 ? ToObject (V )로 한다.
? O .[[Get]] (P , V )를 반환한다.
7.3.4 Set ( O , P , V ,
Throw )
추상 연산 Set은 인수 O (객체), P (프로퍼티 키 ), V (ECMAScript 언어 값 ),
Throw (Boolean)을 받아,
특정 값을 포함하는 정상 완료
unused 또는 throw 완료 를
반환한다. 이 연산은 객체의 특정 프로퍼티 값을 설정할 때 사용된다. V 는 프로퍼티에 할당할 새 값이다. 호출 시 다음 단계를 수행한다:
success 를 ? O .[[Set]] (P , V , O )로
한다.
success 가 false 이고 Throw 가
true 이면 TypeError 예외를 throw한다.
unused 를 반환한다.
7.3.5 CreateDataProperty ( O , P , V
)
추상 연산 CreateDataProperty는 인수 O (객체), P (프로퍼티 키 ), V (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 Boolean
또는 throw 완료 를 반환한다. 이 연산은
객체의 새로운 자기 프로퍼티를 생성하는 데 사용된다. 호출 시 다음 단계를 수행한다:
newDesc 를 PropertyDescriptor { [[Value]] :
V , [[Writable]] : true , [[Enumerable]] : true , [[Configurable]] : true }로 한다.
? O .[[DefineOwnProperty]] (P ,
newDesc )를 반환한다.
참고
이 추상 연산은 ECMAScript 언어의 할당 연산자로 생성된 프로퍼티와 동일한 기본 속성으로 프로퍼티를 생성한다. 일반적으로 프로퍼티는 이미 존재하지
않는다. 만약 존재하고 설정 불가이거나 O 가 확장 가능하지 않다면, [[DefineOwnProperty]] 는 false 를 반환한다.
7.3.6 CreateDataPropertyOrThrow ( O , P ,
V )
추상 연산 CreateDataPropertyOrThrow는 인수 O (객체), P (프로퍼티 키 ), V (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
unused 또는 throw 완료 를
반환한다. 이 연산은 객체의 새로운 자기 프로퍼티를 생성하는 데 사용된다. 요청된 프로퍼티 갱신을 수행할 수 없으면 TypeError
예외를 던진다. 호출 시 다음 단계를 수행한다:
success 를 ? CreateDataProperty (O ,
P , V )로 한다.
success 가 false 이면 TypeError 예외를 throw한다.
unused 를 반환한다.
참고
이 추상 연산은 ECMAScript 언어의 할당 연산자로 생성된 프로퍼티와 동일한 기본 속성으로 프로퍼티를 생성한다. 일반적으로 프로퍼티는 이미 존재하지
않는다. 만약 존재하고 설정 불가이거나 O 가 확장 가능하지 않다면, [[DefineOwnProperty]] 는 false 를 반환하고, 이 연산은
TypeError 예외를 던진다.
7.3.7 CreateNonEnumerableDataPropertyOrThrow ( O ,
P , V )
추상 연산 CreateNonEnumerableDataPropertyOrThrow는 인수 O (객체), P (프로퍼티 키 ),
V (ECMAScript 언어 값 )를 받아
unused 를 반환한다. 이 연산은 일반 객체 의 새로운 비열거형 자기 프로퍼티를 생성하는 데 사용된다. 호출 시 다음 단계를
수행한다:
Assert :
O 는 비설정 불가 프로퍼티가 없는 일반적이고 확장 가능한 객체이다.
newDesc 를 PropertyDescriptor { [[Value]] :
V , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true }로 한다.
! DefinePropertyOrThrow (O ,
P , newDesc )를 수행한다.
unused 를 반환한다.
참고
이 추상 연산은 ECMAScript 언어의 할당 연산자로 생성된 프로퍼티와 동일한 기본 속성으로 프로퍼티를 생성하지만, 열거형이 아니다. 일반적으로 프로퍼티는
이미 존재하지 않는다. 만약 존재한다면 DefinePropertyOrThrow 가 정상적으로
완료됨이 보장된다.
7.3.8 DefinePropertyOrThrow ( O , P ,
desc )
추상 연산 DefinePropertyOrThrow는 인수 O (객체), P (프로퍼티 키 ), desc (프로퍼티 디스크립터 )를 받아,
특정 값을 포함하는 정상 완료
unused 또는 throw 완료 를
반환한다. 이 연산은 객체의 [[DefineOwnProperty]] 내부 메서드를 호출하여, 요청된 프로퍼티 갱신을 수행할 수
없을 경우 TypeError 예외를 던진다. 호출 시 다음 단계를 수행한다:
success 를 ? O .[[DefineOwnProperty]] (P , desc )로
한다.
success 가 false 이면 TypeError 예외를 throw한다.
unused 를 반환한다.
7.3.9 DeletePropertyOrThrow ( O , P )
추상 연산 DeletePropertyOrThrow는 인수 O (객체), P (프로퍼티 키 )를 받아,
특정 값을 포함하는 정상 완료
unused 또는 throw 완료 를
반환한다. 이 연산은 객체의 특정 자기 프로퍼티를 제거하는 데 사용된다. 해당 프로퍼티가 설정 불가라면 예외를 던진다. 호출 시 다음 단계를 수행한다:
success 를 ? O .[[Delete]] (P )로 한다.
success 가 false 이면 TypeError 예외를 throw한다.
unused 를 반환한다.
7.3.10 GetMethod ( V , P )
추상 연산 GetMethod는 인수 V (ECMAScript 언어 값 ),
P (프로퍼티
키 )를 받아,
특정 값을 포함하는 정상 완료 함수 객체
또는 undefined , 혹은 throw 완료 를
반환한다. 이 연산은 해당 프로퍼티의 값이 함수일 것으로 기대되는 ECMAScript 언어 값 의 특정
프로퍼티 값을 가져오는 데 사용된다. 호출 시 다음 단계를 수행한다:
func 를 ? GetV (V , P )로 한다.
func 가 undefined 또는 null 이면
undefined 를 반환한다.
IsCallable (func )이
false 이면 TypeError 예외를 throw한다.
func 를 반환한다.
7.3.11 HasProperty ( O , P )
추상 연산 HasProperty는 인수 O (객체), P (프로퍼티 키 )를 받아,
특정 값을 포함하는 정상 완료 Boolean
또는 throw 완료 를 반환한다. 이 연산은
객체에 지정된 프로퍼티
키 의 프로퍼티가 존재하는지(자기 또는 상속 포함) 확인하는 데 사용된다. 호출 시 다음 단계를 수행한다:
? O .[[HasProperty]] (P )를 반환한다.
7.3.12 HasOwnProperty ( O , P )
추상 연산 HasOwnProperty는 인수 O (객체), P (프로퍼티 키 )를 받아,
특정 값을 포함하는 정상 완료 Boolean
또는 throw 완료 를 반환한다. 이 연산은
객체에 지정된 프로퍼티
키 의 자기 프로퍼티가 존재하는지 확인하는 데 사용된다. 호출 시 다음 단계를 수행한다:
desc 를 ? O .[[GetOwnProperty]] (P )로 한다.
desc 가 undefined 이면 false 를 반환한다.
true 를 반환한다.
7.3.13 Call ( F , V [ ,
argumentsList ] )
추상 연산 Call은 인수 F (ECMAScript 언어 값 ),
V (ECMAScript 언어 값 ), 선택적 인수
argumentsList (ECMAScript 언어 값의
List )를 받아,
특정 값을 포함하는 정상 완료
ECMAScript 언어 값 또는 throw 완료 를 반환한다. 이 연산은 함수
객체의 [[Call]] 내부 메서드를 호출하는 데 사용된다. F 가 함수 객체이고, V 는
[[Call]] 의 this 값이며, argumentsList 는 내부
메서드의 해당 인수로 전달된다. argumentsList 가 없으면, 새로운 빈 List 가 사용된다. 호출 시 다음 단계를
수행한다:
argumentsList 가 없으면, argumentsList 를 새로운 빈 List 로 설정한다.
IsCallable (F )가
false 이면 TypeError 예외를 throw한다.
? F .[[Call]] (V , argumentsList )를
반환한다.
7.3.14 Construct ( F [ , argumentsList [ ,
newTarget ] ] )
추상 연산 Construct는 인수 F (생성자 )와 선택적 인수 argumentsList (List 의 ECMAScript 언어 값 ),
newTarget (생성자 )를 받아,
특정 값을 포함하는 정상 완료 객체 또는
throw 완료 를 반환한다. 이 연산은
함수
객체 의 [[Construct]] 내부 메서드를 호출하는 데 사용된다.
argumentsList 와 newTarget 는 내부 메서드의 해당 인수로 전달되는 값이다.
argumentsList 가 없으면 새로운 빈 List 가 사용된다.
newTarget 가 없으면 F 가 사용된다. 호출 시 다음 단계를 수행한다:
newTarget 가 없으면 newTarget 를 F 로 설정한다.
argumentsList 가 없으면 argumentsList 를 새로운 빈 List 로 설정한다.
? F .[[Construct]] (argumentsList ,
newTarget )를 반환한다.
참고
newTarget 가 없으면 이 연산은 new F(...argumentsList)와 같다.
7.3.15 SetIntegrityLevel ( O , level )
추상 연산 SetIntegrityLevel은 인수 O (객체), level (sealed 또는
frozen )를 받아,
특정 값을 포함하는 정상 완료 Boolean
또는 throw 완료 를 반환한다. 이 연산은
객체의 자기 프로퍼티 집합을 고정하는 데 사용된다. 호출 시 다음 단계를 수행한다:
status 를 ? O .[[PreventExtensions]] ()로
한다.
status 가 false 이면 false 를 반환한다.
keys 를 ? O .[[OwnPropertyKeys]] ()로 한다.
level 이 sealed 이면,
keys 의 각 요소 k 에 대해, 다음을 수행한다:
? DefinePropertyOrThrow (O ,
k , PropertyDescriptor { [[Configurable]] :
false })를 수행한다.
그 외의 경우,
Assert :
level 은 frozen 이다.
keys 의 각 요소 k 에 대해, 다음을 수행한다:
currentDesc 를 ? O .[[GetOwnProperty]] (k )로 한다.
currentDesc 가 undefined 가 아니면, 다음을 수행한다:
IsAccessorDescriptor (currentDesc )
가 true 이면,
desc 를 PropertyDescriptor { [[Configurable]] :
false }로 한다.
그 외의 경우,
desc 를 PropertyDescriptor { [[Configurable]] :
false , [[Writable]] :
false }로 한다.
? DefinePropertyOrThrow (O ,
k , desc )를 수행한다.
true 를 반환한다.
7.3.16 TestIntegrityLevel ( O , level )
추상 연산 TestIntegrityLevel은 인수 O (객체), level (sealed 또는
frozen )를 받아,
특정 값을 포함하는 정상 완료 Boolean
또는 throw 완료 를 반환한다. 이 연산은
객체의 자기 프로퍼티 집합이 고정되어 있는지 판단하는 데 사용된다. 호출 시 다음 단계를 수행한다:
extensible 를 ? IsExtensible (O )로 한다.
extensible 가 true 이면 false 를 반환한다.
참고: 객체가 확장 가능하면, 프로퍼티는 검사하지 않는다.
keys 를 ? O .[[OwnPropertyKeys]] ()로 한다.
keys 의 각 요소 k 에 대해, 다음을 수행한다:
currentDesc 를 ? O .[[GetOwnProperty]] (k )로 한다.
currentDesc 가 undefined 가 아니면, 다음을 수행한다:
currentDesc .[[Configurable]] 가
true 이면 false 를 반환한다.
level 이 frozen 이고 IsDataDescriptor (currentDesc )
가 true 이면,
currentDesc .[[Writable]]
가 true 이면 false 를 반환한다.
true 를 반환한다.
7.3.17 CreateArrayFromList ( elements )
추상 연산 CreateArrayFromList는 인수 elements (List 의 ECMAScript 언어 값 )를 받아,
배열을 반환한다. 이 연산은 elements 가 제공하는 요소로 구성된 배열을 생성하는 데 사용된다. 호출 시 다음 단계를 수행한다:
array 를 ! ArrayCreate (0)으로 한다.
n 을 0으로 한다.
elements 의 각 요소 e 에 대해, 다음을 수행한다:
! CreateDataPropertyOrThrow (array ,
! ToString (𝔽 (n )),
e )를 수행한다.
n 을 n + 1로 설정한다.
array 를 반환한다.
7.3.18 LengthOfArrayLike ( obj )
추상 연산 LengthOfArrayLike는 인수 obj (객체)를 받아,
정상 완료 로 음이 아닌 정수 또는 throw 완료 를 반환한다. 이 연산은
배열과 유사한 객체의 "length" 프로퍼티 값을 반환한다. 호출 시 다음 단계를 수행한다:
ℝ (? ToLength (? Get (obj ,
"length" )))를 반환한다.
배열과 유사한 객체 란 이 연산이 정상 완료 를 반환하는 모든 객체이다.
참고 1
일반적으로 배열과 유사한 객체는
정수
인덱스 이름을 가진 프로퍼티도 가진다. 하지만 이는 이 정의의 필수 조건이 아니다.
참고 2
배열과 문자열 객체는 배열과 유사한 객체의 예시이다.
7.3.19 CreateListFromArrayLike ( obj [ ,
validElementTypes ] )
추상 연산 CreateListFromArrayLike는 인수 obj (ECMAScript 언어 값 )와 선택적
인수 validElementTypes (all 또는
property-key )를 받아,
정상 완료 List (요소는 ECMAScript 언어 값 ) 또는 throw 완료 를 반환한다. 이 연산은
obj 의 인덱스 프로퍼티로부터 제공되는 요소들로 구성된 List 값을 생성하는 데 사용된다.
validElementTypes 는 요소로 허용되는 값의 타입을 나타낸다. 호출 시 다음 단계를 수행한다:
validElementTypes 가 주어지지 않으면, validElementTypes 를
all 로 설정한다.
obj 가 객체가 아니면 TypeError 예외를
throw한다.
len 을 ? LengthOfArrayLike (obj )로 한다.
list 를 새로운 빈 List 로 한다.
index 를 0으로 한다.
index < len 동안 반복한다,
indexName 을 ! ToString (𝔽 (index ))로 한다.
next 를 ? Get (obj ,
indexName )로 한다.
validElementTypes 가 property-key 이고
next 가 프로퍼티 키 가 아니면
TypeError 예외를 throw한다.
next 를 list 에 추가한다.
index 를 index + 1로 한다.
list 를 반환한다.
7.3.20 Invoke ( V , P [ ,
argumentsList ] )
추상 연산 Invoke는 인수 V (ECMAScript 언어 값 ),
P (프로퍼티
키 ), 선택적 인수 argumentsList (ECMAScript 언어 값의 List )를
받아,
정상 완료 ECMAScript 언어 값 또는 throw 완료 를 반환한다. 이 연산은
ECMAScript 언어 값 의 메서드 프로퍼티를 호출하는 데
사용된다.
V 는 프로퍼티 조회 지점이자 호출 시 this 값으로 사용된다. argumentsList 는 메서드에
전달되는 인자 값들의 목록이다. argumentsList 가 없다면 새로운 빈 List 가 사용된다. 호출 시 다음 단계를
수행한다:
argumentsList 가 없으면 argumentsList 를 새로운 빈 List 로 한다.
func 를 ? GetV (V , P )로 한다.
? Call (func , V ,
argumentsList )를 반환한다.
7.3.21 OrdinaryHasInstance ( C , O )
추상 연산 OrdinaryHasInstance는 인수 C (ECMAScript 언어 값 ),
O (ECMAScript 언어 값 )를 받아,
정상 완료 Boolean 또는
throw 완료 를 반환한다. 이 연산은
O 가 C 가 제공하는 인스턴스 객체 상속 경로에서 상속받는지의 기본 알고리즘을 구현한다. 호출 시 다음 단계를 수행한다:
IsCallable (C )가
false 이면 false 를 반환한다.
C 에 [[BoundTargetFunction]] 내부 슬롯이 있으면,
BC 를 C .[[BoundTargetFunction]] 로
한다.
? InstanceofOperator (O ,
BC )를 반환한다.
O 가 객체가 아니면 false 를 반환한다.
P 를 ? Get (C ,
"prototype" )로 한다.
P 가 객체가 아니면 TypeError 예외를
throw한다.
반복한다,
O 를 ? O .[[GetPrototypeOf]] ()로 한다.
O 가 null 이면 false 를 반환한다.
SameValue (P ,
O )가 true 이면 true 를 반환한다.
7.3.22 SpeciesConstructor ( O ,
defaultConstructor )
추상 연산 SpeciesConstructor는 인수 O (객체), defaultConstructor (생성자 )를 받아,
정상 완료 로 생성자 또는 throw 완료 를 반환한다. 이 연산은
O 로부터 파생된 새 객체를 생성하는 데 사용할 생성자 를 검색하는 데 사용된다. defaultConstructor 는
O 에서 생성자 %Symbol.species% 프로퍼티를 찾을 수
없을 때 사용된다. 호출 시 다음 단계를 수행한다:
C 를 ? Get (O ,
"constructor" )로 한다.
C 가 undefined 이면 defaultConstructor 를 반환한다.
C 가 객체가 아니면 TypeError 예외를
throw한다.
S 를 ? Get (C , %Symbol.species% )로 한다.
S 가 undefined 또는 null 이면
defaultConstructor 를 반환한다.
IsConstructor (S )가
true 이면 S 를 반환한다.
TypeError 예외를 throw한다.
7.3.23 EnumerableOwnProperties ( O , kind )
추상 연산 EnumerableOwnProperties는 인수 O (객체), kind (key ,
value , key+value )를 받아,
정상 완료 List (ECMAScript 언어 값 ) 또는 throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
ownKeys 를 ? O .[[OwnPropertyKeys]] ()로 한다.
results 를 새로운 빈 List 로 한다.
ownKeys 의 각 요소 key 에 대해, 다음을 수행한다:
key 가 문자열이면 ,
다음을 수행한다:
desc 를 ? O .[[GetOwnProperty]] (key )로
한다.
desc 가 undefined 가 아니고 desc .[[Enumerable]] 가 true 이면, 다음을
수행한다:
kind 가 key 이면,
key 를 results 에 추가한다.
그 외의 경우,
value 를 ? Get (O ,
key )로 한다.
kind 가 value 이면,
value 를 results 에 추가한다.
그 외의 경우,
Assert :
kind 가
key+value 임을 보장한다.
entry 를 CreateArrayFromList («
key , value »)로 한다.
entry 를 results 에 추가한다.
results 를 반환한다.
7.3.24 GetFunctionRealm ( obj )
추상 연산 GetFunctionRealm은 인수 obj (함수 객체 )를 받아,
정상 완료 Realm Record 또는
throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
obj 에 [[Realm]] 내부 슬롯이 있으면,
obj .[[Realm]] 을 반환한다.
obj 가 bound function exotic
object 이면,
boundTargetFunction 을 obj .[[BoundTargetFunction]] 로 한다.
? GetFunctionRealm (boundTargetFunction )을
반환한다.
obj 가 Proxy exotic object 이면,
? ValidateNonRevokedProxy (obj )를
수행한다.
proxyTarget 을 obj .[[ProxyTarget]] 로
한다.
Assert :
proxyTarget 가 함수 객체 임을 보장한다.
? GetFunctionRealm (proxyTarget )을
반환한다.
현재 Realm Record 를 반환한다.
참고
4 단계는
obj 가 [[Realm]] 내부 슬롯이 없는 비표준 함수 특수 객체 일
때만 도달한다.
7.3.25 CopyDataProperties ( target , source ,
excludedItems )
추상 연산 CopyDataProperties는 인수 target (객체), source (ECMAScript 언어 값 ),
excludedItems (프로퍼티 키의
List )를 받아,
정상 완료
unused 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
source 가 undefined 또는 null 이면,
unused 를 반환한다.
from 을 ! ToObject (source )로 한다.
keys 를 ? from .[[OwnPropertyKeys]] ()로 한다.
keys 의 각 요소 nextKey 에 대해, 다음을 수행한다:
excluded 를 false 로 한다.
excludedItems 의 각 요소 e 에 대해, 다음을 수행한다:
SameValue (e ,
nextKey )가 true 이면,
excluded 를 true 로 설정한다.
excluded 가 false 이면, 다음을 수행한다:
desc 를 ? from .[[GetOwnProperty]] (nextKey )로
한다.
desc 가 undefined 가 아니고 desc .[[Enumerable]] 가 true 이면, 다음을
수행한다:
propValue 를 ? Get (from ,
nextKey )로 한다.
! CreateDataPropertyOrThrow (target ,
nextKey , propValue )를 수행한다.
unused 를 반환한다.
참고
여기서 전달된 target은 항상 새로 생성된 객체이므로, 오류가 발생해도 직접 접근할 수 없다.
7.3.26 PrivateElementFind ( O , P )
추상 연산 PrivateElementFind는 인수 O (객체), P (프라이빗 이름 )를 받아,
PrivateElement 또는
empty 를 반환한다. 호출 시 다음 단계를 수행한다:
O .[[PrivateElements]] 에 PrivateElement
pe 가 존재하고, pe .[[Key]] 가 P 와 같으면,
pe 를 반환한다.
empty 를 반환한다.
7.3.27 PrivateFieldAdd ( O , P ,
value )
추상 연산 PrivateFieldAdd는 인수 O (객체), P (프라이빗 이름 ),
value (ECMAScript 언어 값 )를 받아,
정상 완료
unused 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
호스트 가 웹 브라우저이면,
? HostEnsureCanAddPrivateElement (O )를
수행한다.
entry 를 PrivateElementFind (O ,
P )로 한다.
entry 가 empty 가 아니면 TypeError 예외를
throw한다.
PrivateElement {
[[Key]] : P , [[Kind]] :
field , [[Value]] :
value }를 O .[[PrivateElements]] 에
추가한다.
unused 를 반환한다.
7.3.28 PrivateMethodOrAccessorAdd ( O , method
)
추상 연산 PrivateMethodOrAccessorAdd는 인수 O (객체), method (PrivateElement )를 받아,
정상 완료
unused 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
Assert :
method .[[Kind]] 가 method 또는
accessor 임을 보장한다.
호스트 가 웹 브라우저이면,
? HostEnsureCanAddPrivateElement (O )를
수행한다.
entry 를 PrivateElementFind (O ,
method .[[Key]] )로 한다.
entry 가 empty 가 아니면 TypeError 예외를
throw한다.
method 를 O .[[PrivateElements]] 에 추가한다.
unused 를 반환한다.
참고
프라이빗 메서드와 접근자의 값은 인스턴스 간에 공유된다. 이 연산은 메서드나 접근자의 새 복사본을 생성하지 않는다.
7.3.29 HostEnsureCanAddPrivateElement ( O )
호스트 정의 추상 연산
HostEnsureCanAddPrivateElement는 인수 O (객체)를 받아,
정상 완료
unused 또는 throw 완료 를
반환한다. 이 연산은 호스트
환경 이 특정 호스트 정의 특수 객체 에 프라이빗 요소 추가를 방지할 수 있도록 한다.
HostEnsureCanAddPrivateElement의 구현은 다음 요구사항을 따라야 한다:
HostEnsureCanAddPrivateElement의 기본 구현은 NormalCompletion (unused )을
반환하는 것이다.
이 추상 연산은 ECMAScript 호스트 가 웹
브라우저인 경우에만 호출된다.
7.3.30 PrivateGet ( O , P )
추상 연산 PrivateGet은 인수 O (객체), P (프라이빗 이름 )를 받아,
정상 완료 ECMAScript 언어 값 또는 throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
entry 를 PrivateElementFind (O ,
P )로 한다.
entry 가 empty 이면 TypeError 예외를
throw한다.
entry .[[Kind]] 가 field 또는
method 이면,
entry .[[Value]] 를 반환한다.
Assert :
entry .[[Kind]] 가 accessor 임을
보장한다.
entry .[[Get]] 이 undefined 이면
TypeError 예외를 throw한다.
getter 를 entry .[[Get]] 로 한다.
? Call (getter , O )를 반환한다.
7.3.31 PrivateSet ( O , P , value )
추상 연산 PrivateSet은 인수 O (객체), P (프라이빗 이름 ),
value (ECMAScript 언어 값 )를 받아,
정상 완료
unused 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
entry 를 PrivateElementFind (O ,
P )로 한다.
entry 가 empty 이면 TypeError 예외를
throw한다.
entry .[[Kind]] 가 field 이면,
entry .[[Value]] 에 value 를 할당한다.
그 외 entry .[[Kind]] 가 method 이면,
TypeError 예외를 throw한다.
그 외의 경우,
Assert :
entry .[[Kind]] 가
accessor 임을 보장한다.
entry .[[Set]] 이
undefined 이면 TypeError 예외를 throw한다.
setter 를 entry .[[Set]] 로 한다.
? Call (setter , O ,
« value » )를 수행한다.
unused 를 반환한다.
7.3.32 DefineField ( receiver , fieldRecord )
추상 연산 DefineField는 인수 receiver (객체), fieldRecord (ClassFieldDefinition
Record )를 받아,
정상 완료
unused 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
fieldName 을 fieldRecord .[[Name]] 로 한다.
initializer 를 fieldRecord .[[Initializer]] 로
한다.
initializer 가 empty 가 아니면,
initValue 를 ? Call (initializer ,
receiver )로 한다.
그 외의 경우,
initValue 를 undefined 로 한다.
fieldName 이 프라이빗 이름 이면,
? PrivateFieldAdd (receiver ,
fieldName , initValue )를 수행한다.
그 외의 경우,
Assert :
fieldName 이 프로퍼티 키 임을 보장한다.
? CreateDataPropertyOrThrow (receiver ,
fieldName , initValue )를 수행한다.
unused 를 반환한다.
7.3.33 InitializeInstanceElements ( O ,
constructor )
추상 연산 InitializeInstanceElements는 인수 O (객체), constructor (ECMAScript
함수
객체 )를 받아,
정상 완료
unused 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
methods 를 constructor .[[PrivateMethods]] 로
한다.
methods 의 각 PrivateElement
method 에 대해, 다음을 수행한다:
? PrivateMethodOrAccessorAdd (O ,
method )를 수행한다.
fields 를 constructor .[[Fields]] 로 한다.
fields 의 각 요소 fieldRecord 에 대해, 다음을 수행한다:
? DefineField (O ,
fieldRecord )를 수행한다.
unused 를 반환한다.
7.3.34 AddValueToKeyedGroup ( groups , key ,
value )
추상 연산 AddValueToKeyedGroup은 인수 groups (List 의 Record 이며, 필드 [[Key]] (ECMAScript 언어 값 )와
[[Elements]] (List 의
ECMAScript 언어 값 )),
key (ECMAScript 언어 값 ),
value (ECMAScript 언어 값 )를 받아
unused 를 반환한다. 호출 시 다음 단계를 수행한다:
groups 의 각 Record { [[Key]] , [[Elements]] } g 에
대해, 다음을 수행한다:
SameValue (g .[[Key]] , key )가 true 이면,
Assert : groups 의 정확히 하나의
요소만 이 조건을 만족한다.
value 를 g .[[Elements]] 에
추가한다.
unused 를 반환한다.
group 을 Record { [[Key]] : key , [[Elements]] :
« value » }로 한다.
group 을 groups 에 추가한다.
unused 를 반환한다.
7.3.35 GroupBy ( items , callback ,
keyCoercion )
추상 연산 GroupBy는 인수 items (ECMAScript 언어 값 ),
callback (ECMAScript 언어 값 ),
keyCoercion (property 또는 collection )를
받아,
정상 완료 List (Record 이며, 필드 [[Key]] (ECMAScript 언어 값 ) 및
[[Elements]] (List 의
ECMAScript 언어 값 )), 또는 throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
? RequireObjectCoercible (items )를
수행한다.
IsCallable (callback )이
false 이면 TypeError 예외를 throw한다.
groups 를 새로운 빈 List 로 한다.
iteratorRecord 를 ? GetIterator (items ,
sync )로 한다.
k 를 0으로 한다.
반복한다,
k ≥ 253 - 1이면,
error 를 ThrowCompletion (새로
생성된 TypeError 객체)로 한다.
? IteratorClose (iteratorRecord ,
error )를 반환한다.
next 를 ? IteratorStepValue (iteratorRecord )로
한다.
next 가 done 이면,
groups 를 반환한다.
value 를 next 로 한다.
key 를 Completion (Call (callback ,
undefined , « value , 𝔽 (k ) »))로 한다.
IfAbruptCloseIterator (key ,
iteratorRecord )를 수행한다.
keyCoercion 이 property 이면,
key 를 Completion (ToPropertyKey (key ))로
설정한다.
IfAbruptCloseIterator (key ,
iteratorRecord )를 수행한다.
그 외의 경우,
Assert : keyCoercion 이
collection 임을 보장한다.
key 를 CanonicalizeKeyedCollectionKey (key )로
설정한다.
AddValueToKeyedGroup (groups ,
key , value )를 수행한다.
k 를 k + 1로 설정한다.
7.3.36 SetterThatIgnoresPrototypeProperties ( thisValue ,
home , p , v )
추상 연산 SetterThatIgnoresPrototypeProperties는 인수 thisValue (ECMAScript 언어 값 ),
home (객체), p (프로퍼티 키 ), v (ECMAScript 언어 값 )를 받아,
정상 완료
unused 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
thisValue 가 객체가 아니면 ,
TypeError 예외를 throw한다.
SameValue (thisValue ,
home )가 true 이면,
참고: 여기서 예외를 던지는 것은 home 객체의 strict mode 코드 에서 쓰기 불가 데이터
프로퍼티에 대입하는 효과를 모방한다.
TypeError 예외를 throw한다.
desc 를 ? thisValue .[[GetOwnProperty]] (p )로 한다.
desc 가 undefined 이면,
? CreateDataPropertyOrThrow (thisValue ,
p , v )를 수행한다.
그 외의 경우,
? Set (thisValue ,
p , v , true )를 수행한다.
unused 를 반환한다.
7.4 반복자 객체에 대한 연산
공통 반복 인터페이스(27.1 참조).
7.4.1 반복자 레코드
반복자 레코드 는 Record 값으로, 반복자 또는 비동기 반복자 와 next 메서드를 캡슐화하는
데 사용된다.
반복자 레코드는 표 15 에 나열된 필드를 가진다.
표 15: 반복자 레코드 필드
7.4.2 GetIteratorDirect ( obj )
추상 연산 GetIteratorDirect는 인수 obj (객체)를 받아,
정상 완료 로 반복자
레코드 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
nextMethod 를 ? Get (obj ,
"next" )로 한다.
iteratorRecord 를 반복자 레코드 { [[Iterator]] : obj , [[NextMethod]] : nextMethod , [[Done]] : false }로 한다.
iteratorRecord 를 반환한다.
7.4.3 GetIteratorFromMethod ( obj , method )
추상 연산 GetIteratorFromMethod는 인수 obj (ECMAScript 언어 값 ),
method (함수
객체 )를 받아,
정상 완료 로 반복자
레코드 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
iterator 를 ? Call (method ,
obj )로 한다.
iterator 가 객체가 아니면 TypeError 예외를
throw한다.
? GetIteratorDirect (iterator )를 반환한다.
7.4.4 GetIterator ( obj , kind )
추상 연산 GetIterator는 인수 obj (ECMAScript 언어 값 ),
kind (sync 또는 async )를 받아,
정상 완료 로 반복자
레코드 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
kind 가 async 이면,
method 를 ? GetMethod (obj , %Symbol.asyncIterator% )로
한다.
method 가 undefined 이면,
syncMethod 를 ? GetMethod (obj ,
%Symbol.iterator% )로
한다.
syncMethod 가 undefined 이면
TypeError 예외를 throw한다.
syncIteratorRecord 를 ? GetIteratorFromMethod (obj ,
syncMethod )로 한다.
CreateAsyncFromSyncIterator (syncIteratorRecord )를
반환한다.
그 외의 경우,
method 를 ? GetMethod (obj , %Symbol.iterator% )로 한다.
method 가 undefined 이면 TypeError 예외를
throw한다.
? GetIteratorFromMethod (obj ,
method )를 반환한다.
7.4.5 GetIteratorFlattenable ( obj ,
primitiveHandling )
추상 연산 GetIteratorFlattenable는 인수 obj (ECMAScript 언어 값 ),
primitiveHandling (iterate-string-primitives 또는
reject-primitives )를 받아,
정상 완료 로 반복자
레코드 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
obj 가 객체가 아니면 ,
primitiveHandling 이 reject-primitives 이면
TypeError 예외를 throw한다.
Assert :
primitiveHandling 이 iterate-string-primitives 임을
보장한다.
obj 가 문자열이
아니면 , TypeError 예외를 throw한다.
method 를 ? GetMethod (obj , %Symbol.iterator% )로 한다.
method 가 undefined 이면,
iterator 를 obj 로 한다.
그 외의 경우,
iterator 를 ? Call (method ,
obj )로 한다.
iterator 가 객체가 아니면 TypeError 예외를
throw한다.
? GetIteratorDirect (iterator )를 반환한다.
7.4.6 IteratorNext ( iteratorRecord [ , value
] )
추상 연산 IteratorNext는 인수 iteratorRecord (반복자 레코드 ), 선택적 인수
value (ECMAScript 언어 값 )를 받아,
정상 완료 객체 또는 throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
value 가 없으면,
result 를 Completion (Call (iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] ))로 한다.
그 외의 경우,
result 를 Completion (Call (iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] , « value »))로 한다.
result 가 throw
완료 이면,
iteratorRecord .[[Done]] 를
true 로 설정한다.
? result 를 반환한다.
result 를 ! result 로 설정한다.
result 가 객체가 아니면 ,
iteratorRecord .[[Done]] 를
true 로 설정한다.
TypeError 예외를 throw한다.
result 를 반환한다.
7.4.7 IteratorComplete ( iteratorResult )
추상 연산 IteratorComplete는 인수 iteratorResult (객체)를 받아,
정상 완료 불린 또는 throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
ToBoolean (? Get (iteratorResult ,
"done" ))를 반환한다.
7.4.8 IteratorValue ( iteratorResult )
추상 연산 IteratorValue는 인수 iteratorResult (객체)를 받아,
정상 완료 ECMAScript 언어 값 또는 throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
? Get (iteratorResult ,
"value" )를 반환한다.
7.4.9 IteratorStep ( iteratorRecord )
추상 연산 IteratorStep은 인수 iteratorRecord (반복자 레코드 )를 받아,
정상 완료 객체 또는
done , 또는 throw 완료 를
반환한다. iteratorRecord .[[Iterator]] 의
iteratorRecord .[[NextMethod]] 를 호출하여 다음 값을 요청하고, 끝에 도달하면
done 를 반환하며, 다음 값이 있으면 IteratorResult 객체 를
반환한다. 호출 시 다음 단계를 수행한다:
result 를 ? IteratorNext (iteratorRecord )로 한다.
done 을 Completion (IteratorComplete (result ))로 한다.
done 이 throw
완료 이면,
iteratorRecord .[[Done]] 를
true 로 설정한다.
? done 을 반환한다.
done 을 ! done 으로 설정한다.
done 이 true 이면,
iteratorRecord .[[Done]] 를
true 로 설정한다.
done 를 반환한다.
result 를 반환한다.
7.4.10 IteratorStepValue ( iteratorRecord )
추상 연산 IteratorStepValue는 인수 iteratorRecord (반복자 레코드 )를 받아,
정상 완료 ECMAScript 언어 값 또는
done , 또는 throw 완료 를
반환한다. iteratorRecord .[[Iterator]] 의
iteratorRecord .[[NextMethod]] 를 호출하여 다음 값을 요청하고, 끝에 도달하면
done 를 반환하며, 다음 값이 있으면 그 값을 반환한다. 호출 시 다음 단계를 수행한다:
result 를 ? IteratorStep (iteratorRecord )로 한다.
result 가 done 이면,
done 를 반환한다.
value 를 Completion (IteratorValue (result ))로 한다.
value 가 throw
완료 이면,
iteratorRecord .[[Done]] 를
true 로 설정한다.
? value 를 반환한다.
7.4.11 IteratorClose ( iteratorRecord ,
completion )
추상 연산 IteratorClose는 인수 iteratorRecord (반복자 레코드 ),
completion (Completion
Record )를 받아,
Completion Record 를 반환한다.
이는 반복자 가 완료 상태가 되었을 때 수행해야 할 동작을 알리는 데 사용된다.
호출 시 다음 단계를 수행한다:
Assert :
iteratorRecord .[[Iterator]] 가 객체임 을 보장한다.
iterator 를 iteratorRecord .[[Iterator]] 로
한다.
innerResult 를 Completion (GetMethod (iterator ,
"return" ))로 한다.
innerResult 가 정상
완료 이면,
return 을 innerResult .[[Value]] 로
한다.
return 이 undefined 이면 ? completion 을
반환한다.
innerResult 를 Completion (Call (return ,
iterator ))로 설정한다.
completion 이 throw
완료 이면 ? completion 을 반환한다.
innerResult 가 throw
완료 이면 ? innerResult 를 반환한다.
innerResult .[[Value]] 가 객체가
아니면 TypeError 예외를 throw한다.
? completion 을 반환한다.
7.4.12 IfAbruptCloseIterator ( value ,
iteratorRecord )
IfAbruptCloseIterator는 반복자 레코드 를 사용하는 알고리즘 단계 시퀀스의 약식 표현이다. 다음과 같은
알고리즘 단계는:
IfAbruptCloseIterator (value ,
iteratorRecord ).
다음과 동일하다:
Assert :
value 는 Completion
Record 이다.
value 가 abrupt
완료 이면,
? IteratorClose (iteratorRecord ,
value )를 반환한다.
그 외의 경우, value 를 ! value 로 설정한다.
7.4.13 AsyncIteratorClose ( iteratorRecord ,
completion )
추상 연산 AsyncIteratorClose는 인수 iteratorRecord (반복자 레코드 ),
completion (Completion
Record )를 받아,
Completion Record 를 반환한다.
이는 비동기 반복자 가 완료 상태가 되었을 때 수행해야 할 동작을 알리는
데 사용된다. 호출 시 다음 단계를 수행한다:
Assert :
iteratorRecord .[[Iterator]] 가 객체임 을 보장한다.
iterator 를 iteratorRecord .[[Iterator]] 로
한다.
innerResult 를 Completion (GetMethod (iterator ,
"return" ))로 한다.
innerResult 가 정상
완료 이면,
return 을 innerResult .[[Value]] 로
한다.
return 이 undefined 이면 ? completion 을
반환한다.
innerResult 를 Completion (Call (return ,
iterator ))로 설정한다.
innerResult 가 정상 완료 이면,
innerResult 를 Completion (Await (innerResult .[[Value]] ))로 설정한다.
completion 이 throw
완료 이면 ? completion 을 반환한다.
innerResult 가 throw
완료 이면 ? innerResult 를 반환한다.
innerResult .[[Value]] 가 객체가
아니면 TypeError 예외를 throw한다.
? completion 을 반환한다.
7.4.14 CreateIteratorResultObject ( value ,
done )
추상 연산 CreateIteratorResultObject는 인수 value (ECMAScript 언어 값 ),
done (불린)을 받아,
IteratorResult 인터페이스 를 따르는 객체를 반환한다.
호출 시 다음 단계를 수행한다:
obj 를 OrdinaryObjectCreate (%Object.prototype% )로
한다.
! CreateDataPropertyOrThrow (obj ,
"value" , value )를 수행한다.
! CreateDataPropertyOrThrow (obj ,
"done" , done )를 수행한다.
obj 를 반환한다.
7.4.15 CreateListIteratorRecord ( list )
추상 연산 CreateListIteratorRecord는 인수 list (ECMAScript 언어 값의 List )를
받아,
반복자
레코드 를 반환한다. 이 연산은 [[NextMethod]] 가
list 의 요소를 차례로 반환하는 반복자 레코드 를 생성한다. 호출 시 다음 단계를 수행한다:
closure 를 인수가 없고 list 를 캡처하는 새로운 Abstract
Closure 로 한다. 호출 시 다음 단계를 수행한다:
list 의 각 요소 E 에 대해, 다음을 수행한다:
? GeneratorYield (CreateIteratorResultObject (E ,
false ))를 수행한다.
NormalCompletion (undefined )을
반환한다.
iterator 를 CreateIteratorFromClosure (closure ,
empty , %Iterator.prototype% )로
한다.
반복자 레코드 { [[Iterator]] : iterator , [[NextMethod]] : %GeneratorPrototype.next%, [[Done]] : false }를 반환한다.
참고
리스트 반복자 객체 는 ECMAScript 코드에서 직접 접근할 수
없다.
7.4.16 IteratorToList ( iteratorRecord )
추상 연산 IteratorToList는 인수 iteratorRecord (반복자 레코드 )를 받아,
정상 완료 ECMAScript 언어 값의 List 또는
throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
values 를 새로운 빈 List 로 한다.
반복한다,
next 를 ? IteratorStepValue (iteratorRecord )로
한다.
next 가 done 이면,
values 를 반환한다.
next 를 values 에 추가한다.
8 구문 지시 연산
이 절에 정의된 것 외에도, 특수화된 구문 지시
연산 이 이 명세 전반에 걸쳐 정의되어 있다.
8.1 런타임 의미론: 평가
구문 지시 연산
Evaluation은 인수를 받지 않고 Completion
Record 를 반환한다.
참고
이 연산의 정의는 본 명세의 "ECMAScript 언어" 절들에 분산되어 있다. 각 정의는 해당 생성 규칙의 정의 위치 뒤에 나타난다.
8.2 스코프 분석
8.2.1 정적 의미론: BoundNames
구문 지시 연산
BoundNames는 인수를 받지 않고 문자열의
List 를 반환한다.
참고
"*default*" 는 이 명세 내에서, 별도의 이름이 없는 모듈의 기본 내보내기(default export)에 대한
합성
이름으로 사용된다. 해당 이름으로 모듈의 [[Environment]] 에 항목이 생성되고, 해당 값이
보관된다.
ResolveExport ( exportName [ ,
resolveSet ] ) 를 호출해 "default" 라는
내보내기를 해석하면, [[BindingName]] 이
"*default*" 인
ResolvedBinding Record 를 반환하게
되며,
이는 모듈의 [[Environment]] 에서 위에서 언급한 값으로 해석된다. 이는 명세의 편의를 위해서만
이루어지며, 익명 기본 내보내기 또한 다른 내보내기와 동일하게 해석할 수 있도록 한다. 이 "*default*"
문자열은
ECMAScript 코드나 모듈 연결 알고리즘에서는 접근할 수 없다.
이는 다음 생성 규칙들에 대해 분할적으로 정의된다:
BindingIdentifier
: Identifier
리스트 의 유일한 요소가
StringValue 인 Identifier 를 반환한다.
BindingIdentifier
: yield
« "yield" »를 반환한다.
BindingIdentifier
: await
« "await" »를 반환한다.
LexicalDeclaration
:
LetOrConst
BindingList
;
BoundNames of BindingList 를 반환한다.
BindingList :
BindingList
,
LexicalBinding
names1 을 BoundNames of BindingList 로 한다.
names2 를 BoundNames of LexicalBinding 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
LexicalBinding :
BindingIdentifier
Initializer opt
BoundNames of BindingIdentifier 를
반환한다.
LexicalBinding :
BindingPattern
Initializer
BoundNames of BindingPattern 를
반환한다.
VariableDeclarationList
:
VariableDeclarationList
,
VariableDeclaration
names1 을 BoundNames of VariableDeclarationList 로
한다.
names2 를 BoundNames of VariableDeclaration 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
VariableDeclaration
:
BindingIdentifier
Initializer opt
BoundNames of BindingIdentifier 를
반환한다.
VariableDeclaration
:
BindingPattern
Initializer
BoundNames of BindingPattern 를
반환한다.
ObjectBindingPattern
:
{
}
새로운 빈 리스트 를 반환한다.
ObjectBindingPattern
:
{
BindingPropertyList
,
BindingRestProperty
}
names1 을 BoundNames of BindingPropertyList 로 한다.
names2 를 BoundNames of BindingRestProperty 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
ArrayBindingPattern
:
[
Elision opt
]
새로운 빈 리스트 를 반환한다.
ArrayBindingPattern
:
[
Elision opt
BindingRestElement
]
BoundNames of BindingRestElement 를
반환한다.
ArrayBindingPattern
:
[
BindingElementList
,
Elision opt
]
BoundNames of BindingElementList 를
반환한다.
ArrayBindingPattern
:
[
BindingElementList
,
Elision opt
BindingRestElement
]
names1 을 BoundNames of BindingElementList 로
한다.
names2 를 BoundNames of BindingRestElement 로
한다.
list-concatenation of
names1 과 names2 를 반환한다.
BindingPropertyList
:
BindingPropertyList
,
BindingProperty
names1 을 BoundNames of BindingPropertyList 로 한다.
names2 를 BoundNames of BindingProperty 로
한다.
list-concatenation of
names1 과 names2 를 반환한다.
BindingElementList
:
BindingElementList
,
BindingElisionElement
names1 을 BoundNames of BindingElementList 로
한다.
names2 를 BoundNames of BindingElisionElement 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
BindingElisionElement
:
Elision opt
BindingElement
BoundNames of BindingElement 를
반환한다.
BindingProperty
:
PropertyName
:
BindingElement
BoundNames of BindingElement 를
반환한다.
SingleNameBinding
:
BindingIdentifier
Initializer opt
BoundNames of BindingIdentifier 를
반환한다.
BindingElement :
BindingPattern
Initializer opt
BoundNames of BindingPattern 를
반환한다.
ForDeclaration :
LetOrConst
ForBinding
BoundNames of ForBinding 를 반환한다.
FunctionDeclaration
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
BoundNames of BindingIdentifier 를
반환한다.
FunctionDeclaration
:
function
(
FormalParameters
)
{
FunctionBody
}
« "*default*" »를 반환한다.
FormalParameters
:
[empty]
새로운 빈 리스트 를 반환한다.
FormalParameters
:
FormalParameterList
,
FunctionRestParameter
names1 을 BoundNames of FormalParameterList 로 한다.
names2 를 BoundNames of FunctionRestParameter 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
FormalParameterList
:
FormalParameterList
,
FormalParameter
names1 을 BoundNames of FormalParameterList 로 한다.
names2 를 BoundNames of FormalParameter 로
한다.
list-concatenation of
names1 과 names2 를 반환한다.
ArrowParameters
:
CoverParenthesizedExpressionAndArrowParameterList
formals 를 ArrowFormalParameters 로 한다. 이
CoverParenthesizedExpressionAndArrowParameterList 가
covered 한 것이다.
BoundNames of
formals 를 반환한다.
GeneratorDeclaration
:
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
BoundNames of BindingIdentifier 를
반환한다.
GeneratorDeclaration
:
function
*
(
FormalParameters
)
{
GeneratorBody
}
« "*default*" »를 반환한다.
AsyncGeneratorDeclaration
:
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
BoundNames of BindingIdentifier 를
반환한다.
AsyncGeneratorDeclaration
:
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
« "*default*" »를 반환한다.
ClassDeclaration
:
class
BindingIdentifier
ClassTail
BoundNames of BindingIdentifier 를
반환한다.
ClassDeclaration
:
class
ClassTail
« "*default*" »를 반환한다.
AsyncFunctionDeclaration
:
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
BoundNames of BindingIdentifier 를
반환한다.
AsyncFunctionDeclaration
:
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
« "*default*" »를 반환한다.
CoverCallExpressionAndAsyncArrowHead
:
MemberExpression
Arguments
head 를 AsyncArrowHead 로 한다. 이 CoverCallExpressionAndAsyncArrowParameterList 가
covered 한 것이다.
BoundNames of
head 를 반환한다.
ImportDeclaration
:
import
ImportClause
FromClause
WithClause opt
;
BoundNames of ImportClause 를 반환한다.
ImportDeclaration
:
import
ModuleSpecifier
WithClause opt
;
새로운 빈 리스트 를 반환한다.
ImportClause :
ImportedDefaultBinding
,
NameSpaceImport
names1 을 BoundNames of ImportedDefaultBinding 로 한다.
names2 를 BoundNames of NameSpaceImport 로
한다.
list-concatenation of
names1 과 names2 를 반환한다.
ImportClause :
ImportedDefaultBinding
,
NamedImports
names1 을 BoundNames of ImportedDefaultBinding 로 한다.
names2 를 BoundNames of NamedImports 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
NamedImports :
{
}
새로운 빈 리스트 를 반환한다.
ImportsList :
ImportsList
,
ImportSpecifier
names1 을 BoundNames of ImportsList 로 한다.
names2 를 BoundNames of ImportSpecifier 로
한다.
list-concatenation of
names1 과 names2 를 반환한다.
ImportSpecifier
:
ModuleExportName
as
ImportedBinding
BoundNames of ImportedBinding 를
반환한다.
ExportDeclaration
:
export
ExportFromClause
FromClause
WithClause opt
;
export
NamedExports
;
새로운 빈 리스트 를 반환한다.
ExportDeclaration
:
export
VariableStatement
BoundNames of VariableStatement 를
반환한다.
ExportDeclaration
:
export
Declaration
BoundNames of Declaration 를 반환한다.
ExportDeclaration
:
export
default
HoistableDeclaration
declarationNames 를 BoundNames of HoistableDeclaration 로 한다.
만약 declarationNames 에 "*default*" 요소가 없다면,
"*default*" 을 declarationNames 에 추가한다.
declarationNames 를 반환한다.
ExportDeclaration
:
export
default
ClassDeclaration
declarationNames 를 BoundNames of ClassDeclaration 로
한다.
만약 declarationNames 에 "*default*" 요소가 없다면,
"*default*" 을 declarationNames 에 추가한다.
declarationNames 를 반환한다.
ExportDeclaration
:
export
default
AssignmentExpression
;
« "*default*" »를 반환한다.
8.2.2 정적 의미론: DeclarationPart
구문 지향 연산
DeclarationPart는 인자를 받지 않으며 파스 노드 를 반환한다. 다음 생산 규칙에 대해 조각별로 정의된다:
HoistableDeclaration
: FunctionDeclaration
FunctionDeclaration 를 반환한다.
HoistableDeclaration
: GeneratorDeclaration
GeneratorDeclaration 를 반환한다.
HoistableDeclaration
: AsyncFunctionDeclaration
AsyncFunctionDeclaration 를
반환한다.
HoistableDeclaration
: AsyncGeneratorDeclaration
AsyncGeneratorDeclaration 를
반환한다.
Declaration :
ClassDeclaration
ClassDeclaration 를
반환한다.
Declaration :
LexicalDeclaration
LexicalDeclaration 를 반환한다.
8.2.3 정적 의미론: IsConstantDeclaration
구문 지향 연산
IsConstantDeclaration은 인자를 받지 않으며 불리언을 반환한다.
다음 생산 규칙에 대해 조각별로 정의된다:
LexicalDeclaration
:
LetOrConst
BindingList
;
IsConstantDeclaration
of LetOrConst 를 반환한다.
LetOrConst : let
false 를 반환한다.
LetOrConst : const
true 를 반환한다.
FunctionDeclaration
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
GeneratorDeclaration
:
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorDeclaration
:
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionDeclaration
:
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
false 를 반환한다.
ClassDeclaration
:
class
BindingIdentifier
ClassTail
class
ClassTail
false 를 반환한다.
ExportDeclaration
:
export
ExportFromClause
FromClause
;
export
NamedExports
;
export
default
AssignmentExpression
;
false 를 반환한다.
참고
export default AssignmentExpression 를 상수 선언으로
취급할
필요는 없다. 모듈의 default 객체를 참조하는 내부 바운드 이름에 할당을 허용하는 구문이 존재하지 않기 때문이다.
8.2.4 정적 의미론: LexicallyDeclaredNames
구문 지향 연산
LexicallyDeclaredNames는 인자를 받지 않으며
문자열의 리스트 를 반환한다. 다음 생산
규칙에
대해 조각별로 정의된다:
Block :
{
}
새로운 빈 리스트 를 반환한다.
StatementList :
StatementList
StatementListItem
names1 을 LexicallyDeclaredNames
of StatementList 로
한다.
names2 를 LexicallyDeclaredNames
of StatementListItem 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
StatementListItem
: Statement
만약 Statement 가
Statement
:
LabelledStatement
인 경우, LexicallyDeclaredNames
of LabelledStatement 를 반환한다.
새로운 빈 리스트 를 반환한다.
StatementListItem
: Declaration
BoundNames of Declaration 를 반환한다.
CaseBlock :
{
}
새로운 빈 리스트 를 반환한다.
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
첫 번째 CaseClauses 가
존재하면,
names1 을 LexicallyDeclaredNames
of 첫 번째 CaseClauses 로
한다.
그렇지 않으면, names1 을 새로운 빈 리스트 로 한다.
names2 를 LexicallyDeclaredNames
of DefaultClause 로
한다.
두 번째 CaseClauses 가
존재하면,
names3 을 LexicallyDeclaredNames
of 두 번째 CaseClauses 로
한다.
그렇지 않으면, names3 을 새로운 빈 리스트 로 한다.
list-concatenation of
names1 , names2 , names3 를 반환한다.
CaseClauses :
CaseClauses
CaseClause
names1 을 LexicallyDeclaredNames
of CaseClauses 로 한다.
names2 를 LexicallyDeclaredNames
of CaseClause 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
CaseClause :
case
Expression
:
StatementList opt
StatementList 가
존재하면,
LexicallyDeclaredNames
of StatementList 를
반환한다.
새로운 빈 리스트 를 반환한다.
DefaultClause :
default
:
StatementList opt
StatementList 가
존재하면,
LexicallyDeclaredNames
of StatementList 를
반환한다.
새로운 빈 리스트 를 반환한다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
LexicallyDeclaredNames
of LabelledItem 를
반환한다.
LabelledItem :
Statement
새로운 빈 리스트 를 반환한다.
LabelledItem :
FunctionDeclaration
BoundNames of FunctionDeclaration 를 반환한다.
FunctionStatementList
: [empty]
새로운 빈 리스트 를 반환한다.
FunctionStatementList
: StatementList
TopLevelLexicallyDeclaredNames
of StatementList 를
반환한다.
ClassStaticBlockStatementList
: [empty]
새로운 빈 리스트 를 반환한다.
ClassStaticBlockStatementList
: StatementList
TopLevelLexicallyDeclaredNames
of StatementList 를
반환한다.
ConciseBody :
ExpressionBody
새로운 빈 리스트 를 반환한다.
AsyncConciseBody
:
ExpressionBody
새로운 빈 리스트 를 반환한다.
Script : [empty]
새로운 빈 리스트 를 반환한다.
ScriptBody : StatementList
TopLevelLexicallyDeclaredNames
of StatementList 를
반환한다.
참고 1
Script 의 최상위 레벨에서는, 함수 선언이
렉시컬
선언이 아니라 var 선언처럼 취급된다.
참고 2
Module 의
LexicallyDeclaredNames에는 그 안의 모든 import 바인딩의 이름이 포함된다.
ModuleItemList :
ModuleItemList
ModuleItem
names1 을 LexicallyDeclaredNames
of ModuleItemList 로
한다.
names2 를 LexicallyDeclaredNames
of ModuleItem 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
ModuleItem : ImportDeclaration
BoundNames of ImportDeclaration 를
반환한다.
ModuleItem : ExportDeclaration
만약 ExportDeclaration 가
export VariableStatement 인 경우, 새로운 빈
리스트 를 반환한다.
BoundNames of ExportDeclaration 를
반환한다.
ModuleItem : StatementListItem
LexicallyDeclaredNames
of StatementListItem 를 반환한다.
참고 3
Module 의 최상위 레벨에서는, 함수 선언이
var
선언이 아니라 렉시컬 선언처럼 취급된다.
8.2.5 정적 의미론: LexicallyScopedDeclarations
구문 지향 연산
LexicallyScopedDeclarations는 인자를 받지 않으며
리스트 (파스
노드 의 리스트)를 반환한다. 다음 생산 규칙에 대해 조각별로 정의된다:
StatementList :
StatementList
StatementListItem
declarations1 을 LexicallyScopedDeclarations
of StatementList 로
한다.
declarations2 를 LexicallyScopedDeclarations
of StatementListItem 로 한다.
list-concatenation of
declarations1 과 declarations2 를 반환한다.
StatementListItem
: Statement
만약 Statement 가
Statement
:
LabelledStatement
인 경우, LexicallyScopedDeclarations
of LabelledStatement 를 반환한다.
새로운 빈 리스트 를 반환한다.
StatementListItem
: Declaration
리스트 를 반환한다. 유일한
요소는
DeclarationPart
of
Declaration 이다.
CaseBlock :
{
}
새로운 빈 리스트 를 반환한다.
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
첫 번째 CaseClauses 가
존재하면,
declarations1 을 LexicallyScopedDeclarations
of 첫 번째 CaseClauses 로
한다.
그렇지 않으면, declarations1 을 새로운 빈 리스트 로 한다.
declarations2 를 LexicallyScopedDeclarations
of DefaultClause 로
한다.
두 번째 CaseClauses 가
존재하면,
declarations3 을 LexicallyScopedDeclarations
of 두 번째 CaseClauses 로
한다.
그렇지 않으면, declarations3 을 새로운 빈 리스트 로 한다.
list-concatenation of
declarations1 , declarations2 , declarations3 를 반환한다.
CaseClauses :
CaseClauses
CaseClause
declarations1 을 LexicallyScopedDeclarations
of CaseClauses 로 한다.
declarations2 를 LexicallyScopedDeclarations
of CaseClause 로 한다.
list-concatenation of
declarations1 과 declarations2 를 반환한다.
CaseClause :
case
Expression
:
StatementList opt
StatementList 가
존재하면,
LexicallyScopedDeclarations
of StatementList 를
반환한다.
새로운 빈 리스트 를 반환한다.
DefaultClause :
default
:
StatementList opt
StatementList 가
존재하면,
LexicallyScopedDeclarations
of StatementList 를
반환한다.
새로운 빈 리스트 를 반환한다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
LexicallyScopedDeclarations
of LabelledItem 를
반환한다.
LabelledItem :
Statement
새로운 빈 리스트 를 반환한다.
LabelledItem :
FunctionDeclaration
« FunctionDeclaration »를
반환한다.
FunctionStatementList
: [empty]
새로운 빈 리스트 를 반환한다.
FunctionStatementList
: StatementList
TopLevelLexicallyScopedDeclarations
of StatementList 를
반환한다.
ClassStaticBlockStatementList
: [empty]
새로운 빈 리스트 를 반환한다.
ClassStaticBlockStatementList
: StatementList
TopLevelLexicallyScopedDeclarations
of StatementList 를
반환한다.
ConciseBody :
ExpressionBody
새로운 빈 리스트 를 반환한다.
AsyncConciseBody
:
ExpressionBody
새로운 빈 리스트 를 반환한다.
Script : [empty]
새로운 빈 리스트 를 반환한다.
ScriptBody : StatementList
TopLevelLexicallyScopedDeclarations
of StatementList 를
반환한다.
Module : [empty]
새로운 빈 리스트 를 반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
declarations1 을 LexicallyScopedDeclarations
of ModuleItemList 로
한다.
declarations2 를 LexicallyScopedDeclarations
of ModuleItem 로 한다.
list-concatenation of
declarations1 과 declarations2 를 반환한다.
ModuleItem : ImportDeclaration
새로운 빈 리스트 를 반환한다.
ExportDeclaration
:
export
ExportFromClause
FromClause
WithClause opt
;
export
NamedExports
;
export
VariableStatement
새로운 빈 리스트 를 반환한다.
ExportDeclaration
:
export
Declaration
리스트 를 반환한다. 유일한
요소는
DeclarationPart
of
Declaration 이다.
ExportDeclaration
:
export
default
HoistableDeclaration
리스트 를 반환한다. 유일한
요소는
DeclarationPart
of
HoistableDeclaration 이다.
ExportDeclaration
:
export
default
ClassDeclaration
리스트 를 반환한다. 유일한
요소는
ClassDeclaration 이다.
ExportDeclaration
:
export
default
AssignmentExpression
;
리스트 를 반환한다. 유일한
요소는
이 ExportDeclaration 이다.
8.2.6 정적 의미론: VarDeclaredNames
구문 지향 연산
VarDeclaredNames는 인자를 받지 않으며 문자열의
리스트 를
반환한다. 다음 생산 규칙에 대해 조각별로 정의된다:
Statement :
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
새로운 빈 리스트 를 반환한다.
Block :
{
}
새로운 빈 리스트 를 반환한다.
StatementList :
StatementList
StatementListItem
names1 을 VarDeclaredNames
of
StatementList 로
한다.
names2 를 VarDeclaredNames
of
StatementListItem 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
StatementListItem
: Declaration
새로운 빈 리스트 를 반환한다.
VariableStatement
:
var
VariableDeclarationList
;
BoundNames of VariableDeclarationList 를
반환한다.
IfStatement :
if
(
Expression
)
Statement
else
Statement
names1 을 VarDeclaredNames
of
첫 번째 Statement 로 한다.
names2 를 VarDeclaredNames
of
두 번째 Statement 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
IfStatement :
if
(
Expression
)
Statement
VarDeclaredNames
of
Statement 를 반환한다.
DoWhileStatement
:
do
Statement
while
(
Expression
)
;
VarDeclaredNames
of
Statement 를 반환한다.
WhileStatement :
while
(
Expression
)
Statement
VarDeclaredNames
of
Statement 를 반환한다.
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
VarDeclaredNames
of
Statement 를 반환한다.
ForStatement :
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
names1 을 BoundNames of VariableDeclarationList 로
한다.
names2 를 VarDeclaredNames
of
Statement 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
ForStatement :
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
VarDeclaredNames
of
Statement 를 반환한다.
ForInOfStatement
:
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
VarDeclaredNames
of
Statement 를 반환한다.
ForInOfStatement
:
for
(
var
ForBinding
in
Expression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
names1 을 BoundNames of ForBinding 로 한다.
names2 를 VarDeclaredNames
of
Statement 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
참고
WithStatement :
with
(
Expression
)
Statement
VarDeclaredNames
of
Statement 를 반환한다.
SwitchStatement
:
switch
(
Expression
)
CaseBlock
VarDeclaredNames
of
CaseBlock 를 반환한다.
CaseBlock :
{
}
새로운 빈 리스트 를 반환한다.
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
첫 번째 CaseClauses 가
존재하면,
names1 을 VarDeclaredNames
of
첫 번째 CaseClauses 로
한다.
그렇지 않으면, names1 을 새로운 빈 리스트 로 한다.
names2 를 VarDeclaredNames
of
DefaultClause 로
한다.
두 번째 CaseClauses 가
존재하면,
names3 을 VarDeclaredNames
of
두 번째 CaseClauses 로
한다.
그렇지 않으면, names3 을 새로운 빈 리스트 로 한다.
list-concatenation of
names1 , names2 , names3 를 반환한다.
CaseClauses :
CaseClauses
CaseClause
names1 을 VarDeclaredNames
of
CaseClauses 로 한다.
names2 를 VarDeclaredNames
of
CaseClause 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
CaseClause :
case
Expression
:
StatementList opt
StatementList 가
존재하면,
VarDeclaredNames
of
StatementList 를
반환한다.
새로운 빈 리스트 를 반환한다.
DefaultClause :
default
:
StatementList opt
StatementList 가
존재하면,
VarDeclaredNames
of
StatementList 를
반환한다.
새로운 빈 리스트 를 반환한다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
VarDeclaredNames
of
LabelledItem 를
반환한다.
LabelledItem :
FunctionDeclaration
새로운 빈 리스트 를 반환한다.
TryStatement :
try
Block
Catch
names1 을 VarDeclaredNames
of
Block 로 한다.
names2 를 VarDeclaredNames
of
Catch 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
TryStatement :
try
Block
Finally
names1 을 VarDeclaredNames
of
Block 로 한다.
names2 를 VarDeclaredNames
of
Finally 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
TryStatement :
try
Block
Catch
Finally
names1 을 VarDeclaredNames
of
Block 로 한다.
names2 를 VarDeclaredNames
of
Catch 로 한다.
names3 을 VarDeclaredNames
of
Finally 로 한다.
list-concatenation of
names1 , names2 , names3 를 반환한다.
Catch :
catch
(
CatchParameter
)
Block
VarDeclaredNames
of
Block 를 반환한다.
FunctionStatementList
: [empty]
새로운 빈 리스트 를 반환한다.
FunctionStatementList
: StatementList
TopLevelVarDeclaredNames
of StatementList 를
반환한다.
ClassStaticBlockStatementList
: [empty]
새로운 빈 리스트 를 반환한다.
ClassStaticBlockStatementList
: StatementList
TopLevelVarDeclaredNames
of StatementList 를
반환한다.
ConciseBody :
ExpressionBody
새로운 빈 리스트 를 반환한다.
AsyncConciseBody
:
ExpressionBody
새로운 빈 리스트 를 반환한다.
Script : [empty]
새로운 빈 리스트 를 반환한다.
ScriptBody : StatementList
TopLevelVarDeclaredNames
of StatementList 를
반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
names1 을 VarDeclaredNames
of
ModuleItemList 로
한다.
names2 를 VarDeclaredNames
of
ModuleItem 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
ModuleItem : ImportDeclaration
새로운 빈 리스트 를 반환한다.
ModuleItem : ExportDeclaration
만약 ExportDeclaration 가
export VariableStatement 인 경우,
BoundNames of ExportDeclaration 를
반환한다.
새로운 빈 리스트 를 반환한다.
8.2.7 정적 의미론: VarScopedDeclarations
구문 지향 연산
VarScopedDeclarations는 인자를 받지 않으며
리스트 (파스
노드 의 리스트)를 반환한다. 다음 생산 규칙에 대해 조각별로 정의된다:
Statement :
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
새로운 빈 리스트 를 반환한다.
Block :
{
}
새로운 빈 리스트 를 반환한다.
StatementList :
StatementList
StatementListItem
declarations1 을 VarScopedDeclarations
of StatementList 로
한다.
declarations2 를 VarScopedDeclarations
of StatementListItem 로 한다.
list-concatenation of
declarations1 과 declarations2 를 반환한다.
StatementListItem
: Declaration
새로운 빈 리스트 를 반환한다.
VariableDeclarationList
: VariableDeclaration
« VariableDeclaration »를
반환한다.
VariableDeclarationList
:
VariableDeclarationList
,
VariableDeclaration
declarations1 을 VarScopedDeclarations
of VariableDeclarationList 로
한다.
list-concatenation of
declarations1 과 « VariableDeclaration »를
반환한다.
IfStatement :
if
(
Expression
)
Statement
else
Statement
declarations1 을 VarScopedDeclarations
of 첫 번째 Statement 로
한다.
declarations2 를 VarScopedDeclarations
of 두 번째 Statement 로
한다.
list-concatenation of
declarations1 과 declarations2 를 반환한다.
IfStatement :
if
(
Expression
)
Statement
VarScopedDeclarations
of Statement 를 반환한다.
DoWhileStatement
:
do
Statement
while
(
Expression
)
;
VarScopedDeclarations
of Statement 를 반환한다.
WhileStatement :
while
(
Expression
)
Statement
VarScopedDeclarations
of Statement 를 반환한다.
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
VarScopedDeclarations
of Statement 를 반환한다.
ForStatement :
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
declarations1 을 VarScopedDeclarations
of VariableDeclarationList 로
한다.
declarations2 를 VarScopedDeclarations
of Statement 로 한다.
list-concatenation of
declarations1 과 declarations2 를 반환한다.
ForStatement :
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
VarScopedDeclarations
of Statement 를 반환한다.
ForInOfStatement
:
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
VarScopedDeclarations
of Statement 를 반환한다.
ForInOfStatement
:
for
(
var
ForBinding
in
Expression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
declarations1 을(를) « ForBinding »로 둔다.
declarations2 을(를) VarScopedDeclarations
of Statement 로 둔다.
list-concatenation 을(를)
declarations1 과 declarations2 에 대해 반환한다.
참고
WithStatement :
with
(
Expression
)
Statement
VarScopedDeclarations
of Statement 을(를)
반환한다.
SwitchStatement
:
switch
(
Expression
)
CaseBlock
VarScopedDeclarations
of CaseBlock 을(를)
반환한다.
CaseBlock :
{
}
새로운 빈 List 를 반환한다.
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
첫 번째 CaseClauses 가
존재하면,
declarations1 을(를) 첫 번째 VarScopedDeclarations
of CaseClauses 로 둔다.
그렇지 않으면, declarations1 을(를) 새로운 빈 List 로 둔다.
declarations2 을(를) VarScopedDeclarations
of DefaultClause 로
둔다.
두 번째 CaseClauses 가
존재하면,
declarations3 을(를) 두 번째 VarScopedDeclarations
of CaseClauses 로 둔다.
그렇지 않으면, declarations3 을(를) 새로운 빈 List 로 둔다.
list-concatenation 을(를)
declarations1 , declarations2 , declarations3 에 대해
반환한다.
CaseClauses :
CaseClauses
CaseClause
declarations1 을(를) VarScopedDeclarations
of CaseClauses 로 둔다.
declarations2 을(를) VarScopedDeclarations
of CaseClause 로 둔다.
list-concatenation 을(를)
declarations1 과 declarations2 에 대해 반환한다.
CaseClause :
case
Expression
:
StatementList opt
StatementList
가 존재하면, VarScopedDeclarations
of StatementList 을(를)
반환한다.
새로운 빈 List 를 반환한다.
DefaultClause :
default
:
StatementList opt
StatementList
가 존재하면, VarScopedDeclarations
of StatementList 을(를)
반환한다.
새로운 빈 List 를 반환한다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
VarScopedDeclarations
of LabelledItem 을(를)
반환한다.
LabelledItem :
FunctionDeclaration
새로운 빈 List 를 반환한다.
TryStatement :
try
Block
Catch
declarations1 을(를) VarScopedDeclarations
of Block 로 둔다.
declarations2 을(를) VarScopedDeclarations
of Catch 로 둔다.
list-concatenation 을(를)
declarations1 과 declarations2 에 대해 반환한다.
TryStatement :
try
Block
Finally
declarations1 을(를) VarScopedDeclarations
of Block 로 둔다.
declarations2 을(를) VarScopedDeclarations
of Finally 로 둔다.
list-concatenation 을(를)
declarations1 과 declarations2 에 대해 반환한다.
TryStatement :
try
Block
Catch
Finally
declarations1 을(를) VarScopedDeclarations
of Block 로 둔다.
declarations2 을(를) VarScopedDeclarations
of Catch 로 둔다.
declarations3 을(를) VarScopedDeclarations
of Finally 로 둔다.
list-concatenation 을(를)
declarations1 , declarations2 , declarations3 에 대해
반환한다.
Catch :
catch
(
CatchParameter
)
Block
VarScopedDeclarations
of Block 을(를) 반환한다.
FunctionStatementList
: [empty]
새로운 빈 List 를 반환한다.
FunctionStatementList
: StatementList
TopLevelVarScopedDeclarations
of StatementList 를
반환한다.
ClassStaticBlockStatementList
: [empty]
새로운 빈 List 를 반환한다.
ClassStaticBlockStatementList
: StatementList
TopLevelVarScopedDeclarations
of StatementList 를
반환한다.
ConciseBody :
ExpressionBody
새로운 빈 List 를 반환한다.
AsyncConciseBody
:
ExpressionBody
새로운 빈 List 를 반환한다.
Script : [empty]
새로운 빈 List 를 반환한다.
ScriptBody : StatementList
TopLevelVarScopedDeclarations
of StatementList 를
반환한다.
Module : [empty]
새로운 빈 List 를 반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
declarations1 을(를) VarScopedDeclarations
of ModuleItemList 로
둔다.
declarations2 을(를) VarScopedDeclarations
of ModuleItem 로 둔다.
list-concatenation 을(를)
declarations1 과 declarations2 에 대해 반환한다.
ModuleItem : ImportDeclaration
새로운 빈 List 를 반환한다.
ModuleItem : ExportDeclaration
ExportDeclaration 이(가)
export VariableStatement 라면, VarScopedDeclarations
of VariableStatement 을(를) 반환한다.
새로운 빈 List 를 반환한다.
8.2.8 정적 의미론: TopLevelLexicallyDeclaredNames
구문 지시 연산
TopLevelLexicallyDeclaredNames는 인자가 없으며 문자열의 List 를 반환한다. 다음 생성 규칙에
대해
조각별로 정의된다:
StatementList :
StatementList
StatementListItem
names1 을 TopLevelLexicallyDeclaredNames
of StatementList 로
둔다.
names2 를 TopLevelLexicallyDeclaredNames
of StatementListItem 로 둔다.
list-concatenation 을
names1 과
names2 에 대해 반환한다.
StatementListItem
: Statement
새 빈 List 를 반환한다.
StatementListItem
: Declaration
Declaration 이
Declaration
: HoistableDeclaration
라면,
새 빈 List 를
반환한다.
BoundNames of Declaration 를 반환한다.
참고
함수나 스크립트의 최상위 레벨에서는 함수 선언이 렉시컬 선언이 아닌 var 선언처럼 취급된다.
8.2.9 정적 의미론: TopLevelLexicallyScopedDeclarations
구문 지시 연산
TopLevelLexicallyScopedDeclarations는 인자가 없으며 List 의 구문
노드 를 반환한다. 다음 생성 규칙에 대해 조각별로 정의된다:
StatementList :
StatementList
StatementListItem
declarations1 을 TopLevelLexicallyScopedDeclarations
of StatementList 로
둔다.
declarations2 를 TopLevelLexicallyScopedDeclarations
of StatementListItem 로 둔다.
list-concatenation 을
declarations1 과 declarations2 에 대해 반환한다.
StatementListItem
: Statement
새 빈 List 를 반환한다.
StatementListItem
: Declaration
Declaration 이
Declaration
: HoistableDeclaration
라면,
새 빈 List 를
반환한다.
« Declaration »를
반환한다.
8.2.10 정적 의미론: TopLevelVarDeclaredNames
구문 지시 연산
TopLevelVarDeclaredNames는 인자가 없으며 문자열의 List 를 반환한다.
다음 생성 규칙에 대해 조각별로 정의된다:
StatementList :
StatementList
StatementListItem
names1 을 TopLevelVarDeclaredNames
of StatementList 로
둔다.
names2 를 TopLevelVarDeclaredNames
of StatementListItem 로 둔다.
list-concatenation 을
names1 과
names2 에 대해 반환한다.
StatementListItem
: Declaration
Declaration 이
Declaration
: HoistableDeclaration
라면,
BoundNames of
HoistableDeclaration 를
반환한다.
새 빈 List 를 반환한다.
StatementListItem
: Statement
Statement 이
Statement
:
LabelledStatement
라면, TopLevelVarDeclaredNames
of Statement 를 반환한다.
VarDeclaredNames
of
Statement 를 반환한다.
참고
함수 또는 스크립트의 최상위 레벨에서 내부 함수 선언은 var 선언으로 취급된다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
TopLevelVarDeclaredNames
of LabelledItem 를
반환한다.
LabelledItem :
Statement
Statement 이
Statement
:
LabelledStatement
라면, TopLevelVarDeclaredNames
of Statement 를 반환한다.
VarDeclaredNames
of
Statement 를 반환한다.
LabelledItem :
FunctionDeclaration
BoundNames of FunctionDeclaration 를 반환한다.
8.2.11 정적 의미론: TopLevelVarScopedDeclarations
구문 지시 연산
TopLevelVarScopedDeclarations는 인자를 받지 않고 List 의 파스
노드 를 반환한다. 다음 생성 규칙에 대해 조각별로 정의된다:
StatementList :
StatementList
StatementListItem
declarations1 을 TopLevelVarScopedDeclarations
of StatementList 로
둔다.
declarations2 를 TopLevelVarScopedDeclarations
of StatementListItem 로 둔다.
list-concatenation 을
declarations1 과 declarations2 에 대해 반환한다.
StatementListItem
: Statement
Statement 이
Statement
:
LabelledStatement
라면, TopLevelVarScopedDeclarations
of Statement 를 반환한다.
VarScopedDeclarations
of Statement 를 반환한다.
StatementListItem
: Declaration
Declaration 이
Declaration
: HoistableDeclaration
라면,
declaration 을 DeclarationPart
of HoistableDeclaration 로
둔다.
« declaration »를 반환한다.
새 빈 List 를 반환한다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
TopLevelVarScopedDeclarations
of LabelledItem 를
반환한다.
LabelledItem :
Statement
Statement 이
Statement
:
LabelledStatement
라면, TopLevelVarScopedDeclarations
of Statement 를 반환한다.
VarScopedDeclarations
of Statement 를 반환한다.
LabelledItem :
FunctionDeclaration
« FunctionDeclaration »를
반환한다.
8.3 레이블
8.3.1 정적 의미론: ContainsDuplicateLabels
구문 지시 연산
ContainsDuplicateLabels는 labelSet (문자열의 List ) 인자를 받고, Boolean을
반환한다. 이는 다음 생성 규칙에 대해 조각별로 정의된다:
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Block :
{
}
StatementListItem
:
Declaration
false 를 반환한다.
StatementList :
StatementList
StatementListItem
hasDuplicates 를 ContainsDuplicateLabels
of StatementList
(인자
labelSet )로 둔다.
만약 hasDuplicates 가 true 라면, true 를
반환한다.
ContainsDuplicateLabels
of StatementListItem (인자
labelSet )를 반환한다.
IfStatement :
if
(
Expression
)
Statement
else
Statement
hasDuplicate 를 ContainsDuplicateLabels
of 첫 번째 Statement (인자
labelSet )로 둔다.
만약 hasDuplicate 가 true 라면, true 를
반환한다.
두 번째 ContainsDuplicateLabels
of Statement (인자
labelSet )를 반환한다.
IfStatement :
if
(
Expression
)
Statement
ContainsDuplicateLabels
of Statement (인자
labelSet )를 반환한다.
DoWhileStatement
:
do
Statement
while
(
Expression
)
;
ContainsDuplicateLabels
of Statement (인자
labelSet )를 반환한다.
WhileStatement :
while
(
Expression
)
Statement
ContainsDuplicateLabels
of Statement (인자
labelSet )를 반환한다.
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
ContainsDuplicateLabels
of Statement (인자
labelSet )를 반환한다.
ForInOfStatement
:
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
var
ForBinding
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
ContainsDuplicateLabels
of Statement (인자
labelSet )를 반환한다.
참고
WithStatement :
with
(
Expression
)
Statement
ContainsDuplicateLabels
of Statement (인자
labelSet )를 반환한다.
SwitchStatement
:
switch
(
Expression
)
CaseBlock
ContainsDuplicateLabels
of CaseBlock (인자
labelSet )를 반환한다.
CaseBlock :
{
}
false 를 반환한다.
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
첫 번째 CaseClauses 가
존재하면,
첫 번째 ContainsDuplicateLabels
of CaseClauses
(인자 labelSet )가 true 라면,
true 를
반환한다.
ContainsDuplicateLabels
of DefaultClause
(인자
labelSet )가 true 라면, true 를 반환한다.
두 번째 CaseClauses 가
존재하지
않으면, false 를 반환한다.
두 번째 ContainsDuplicateLabels
of CaseClauses (인자
labelSet )를 반환한다.
CaseClauses :
CaseClauses
CaseClause
hasDuplicates 를 ContainsDuplicateLabels
of CaseClauses (인자
labelSet )로 둔다.
hasDuplicates 가 true 라면, true 를 반환한다.
ContainsDuplicateLabels
of CaseClause (인자
labelSet )를 반환한다.
CaseClause :
case
Expression
:
StatementList opt
StatementList 가
존재하면,
ContainsDuplicateLabels
of StatementList
(인자
labelSet )를 반환한다.
false 를 반환한다.
DefaultClause :
default
:
StatementList opt
StatementList 가
존재하면,
ContainsDuplicateLabels
of StatementList
(인자
labelSet )를 반환한다.
false 를 반환한다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
label 을 StringValue of
LabelIdentifier 로
둔다.
labelSet 에 label 이 포함되어 있으면, true 를 반환한다.
newLabelSet 을 list-concatenation of
labelSet 및 « label »로 둔다.
ContainsDuplicateLabels
of LabelledItem
(인자
newLabelSet )를 반환한다.
LabelledItem :
FunctionDeclaration
false 를 반환한다.
TryStatement :
try
Block
Catch
hasDuplicates 를 ContainsDuplicateLabels
of Block (인자
labelSet )로 둔다.
hasDuplicates 가 true 라면, true 를 반환한다.
ContainsDuplicateLabels
of Catch (인자
labelSet )를 반환한다.
TryStatement :
try
Block
Finally
hasDuplicates 를 ContainsDuplicateLabels
of Block (인자
labelSet )로 둔다.
hasDuplicates 가 true 라면, true 를 반환한다.
ContainsDuplicateLabels
of Finally (인자
labelSet )를 반환한다.
TryStatement :
try
Block
Catch
Finally
ContainsDuplicateLabels
of Block (인자
labelSet )가 true 라면, true 를 반환한다.
ContainsDuplicateLabels
of Catch (인자
labelSet )가 true 라면, true 를 반환한다.
ContainsDuplicateLabels
of Finally (인자
labelSet )를 반환한다.
Catch :
catch
(
CatchParameter
)
Block
ContainsDuplicateLabels
of Block (인자
labelSet )를 반환한다.
FunctionStatementList
: [empty]
false 를 반환한다.
ClassStaticBlockStatementList
: [empty]
false 를 반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
hasDuplicates 를 ContainsDuplicateLabels
of ModuleItemList
(인자 labelSet )로 둔다.
hasDuplicates 가 true 라면, true 를 반환한다.
ContainsDuplicateLabels
of ModuleItem (인자
labelSet )를 반환한다.
ModuleItem :
ImportDeclaration
ExportDeclaration
false 를 반환한다.
8.3.2 정적 의미론: ContainsUndefinedBreakTarget
구문 지향 연산
ContainsUndefinedBreakTarget는 labelSet
(문자열의 List ) 인수를 받고
불리언을 반환한다. 다음 생성 규칙들에 대해 조각별로 정의된다:
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Block :
{
}
StatementListItem
:
Declaration
false 를 반환한다.
StatementList :
StatementList
StatementListItem
hasUndefinedLabels 를 ContainsUndefinedBreakTarget
(StatementList ,
labelSet 인수)로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedBreakTarget
(StatementListItem ,
labelSet 인수)를 반환한다.
IfStatement :
if
(
Expression
)
Statement
else
Statement
hasUndefinedLabels 를 첫 번째 Statement
에 labelSet 인수로 ContainsUndefinedBreakTarget 의
결과로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
두 번째 Statement
에 labelSet 인수로 ContainsUndefinedBreakTarget 의
결과를 반환한다.
IfStatement :
if
(
Expression
)
Statement
ContainsUndefinedBreakTarget
(Statement ,
labelSet 인수)를 반환한다.
DoWhileStatement
:
do
Statement
while
(
Expression
)
;
ContainsUndefinedBreakTarget
(Statement ,
labelSet 인수)를 반환한다.
WhileStatement :
while
(
Expression
)
Statement
ContainsUndefinedBreakTarget
(Statement ,
labelSet 인수)를 반환한다.
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
ContainsUndefinedBreakTarget
(Statement ,
labelSet 인수)를 반환한다.
ForInOfStatement
:
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
var
ForBinding
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
ContainsUndefinedBreakTarget
(Statement ,
labelSet 인수)를 반환한다.
참고
BreakStatement :
break
;
false 를 반환한다.
BreakStatement :
break
LabelIdentifier
;
labelSet 에 StringValue (LabelIdentifier )가
포함되어
있지 않으면
true 를 반환한다.
false 를 반환한다.
WithStatement :
with
(
Expression
)
Statement
ContainsUndefinedBreakTarget
(Statement ,
labelSet 인수)를 반환한다.
SwitchStatement
:
switch
(
Expression
)
CaseBlock
ContainsUndefinedBreakTarget
(CaseBlock ,
labelSet 인수)를 반환한다.
CaseBlock :
{
}
false 를 반환한다.
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
첫 번째 CaseClauses 가
있으면,
첫 번째 CaseClauses 에
labelSet
인수로 ContainsUndefinedBreakTarget 의
결과가 true 이면 true 를 반환한다.
DefaultClause 에
labelSet 인수로 ContainsUndefinedBreakTarget 의
결과가 true 이면 true 를 반환한다.
두 번째 CaseClauses 가
없으면
false 를 반환한다.
두 번째 CaseClauses 에
labelSet 인수로 ContainsUndefinedBreakTarget 의
결과를 반환한다.
CaseClauses :
CaseClauses
CaseClause
hasUndefinedLabels 를 ContainsUndefinedBreakTarget
(CaseClauses ,
labelSet 인수)로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedBreakTarget
(CaseClause ,
labelSet 인수)를 반환한다.
CaseClause :
case
Expression
:
StatementList opt
StatementList 가
있으면
ContainsUndefinedBreakTarget
(StatementList ,
labelSet 인수)를 반환한다.
false 를 반환한다.
DefaultClause :
default
:
StatementList opt
StatementList 가
있으면
ContainsUndefinedBreakTarget
(StatementList ,
labelSet 인수)를 반환한다.
false 를 반환한다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
label 을 StringValue (LabelIdentifier )로
한다.
newLabelSet 을 list-concatenation (labelSet ,
« label »)로 한다.
ContainsUndefinedBreakTarget
(LabelledItem ,
newLabelSet 인수)를 반환한다.
LabelledItem :
FunctionDeclaration
false 를 반환한다.
TryStatement :
try
Block
Catch
hasUndefinedLabels 를 ContainsUndefinedBreakTarget
(Block ,
labelSet
인수)로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedBreakTarget
(Catch ,
labelSet
인수)를 반환한다.
TryStatement :
try
Block
Finally
hasUndefinedLabels 를 ContainsUndefinedBreakTarget
(Block ,
labelSet
인수)로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedBreakTarget
(Finally ,
labelSet 인수)를 반환한다.
TryStatement :
try
Block
Catch
Finally
ContainsUndefinedBreakTarget
(Block ,
labelSet
인수)가 true 이면 true 를 반환한다.
ContainsUndefinedBreakTarget
(Catch ,
labelSet
인수)가 true 이면 true 를 반환한다.
ContainsUndefinedBreakTarget
(Finally ,
labelSet 인수)를 반환한다.
Catch :
catch
(
CatchParameter
)
Block
ContainsUndefinedBreakTarget
(Block ,
labelSet
인수)를 반환한다.
FunctionStatementList
: [empty]
false 를 반환한다.
ClassStaticBlockStatementList
: [empty]
false 를 반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
hasUndefinedLabels 를 ContainsUndefinedBreakTarget
(ModuleItemList ,
labelSet 인수)로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedBreakTarget
(ModuleItem ,
labelSet 인수)를 반환한다.
ModuleItem :
ImportDeclaration
ExportDeclaration
false 를 반환한다.
8.3.3 정적 의미론: ContainsUndefinedContinueTarget
구문 지향 연산
ContainsUndefinedContinueTarget는
iterationSet (문자열의 List ),
labelSet (문자열의 List )
인수를 받고
불리언을 반환한다. 다음 생성 규칙들에 대해 조각별로 정의된다:
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Block :
{
}
StatementListItem
:
Declaration
false 를 반환한다.
Statement : BlockStatement
ContainsUndefinedContinueTarget
(BlockStatement ,
iterationSet , « »)의 결과를 반환한다.
BreakableStatement
: IterationStatement
newIterationSet 을 list-concatenation (iterationSet ,
labelSet )로 한다.
ContainsUndefinedContinueTarget
(IterationStatement ,
newIterationSet , « »)의 결과를 반환한다.
StatementList :
StatementList
StatementListItem
hasUndefinedLabels 를 ContainsUndefinedContinueTarget
(StatementList ,
iterationSet , « »)의 결과로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedContinueTarget
(StatementListItem ,
iterationSet , « »)의 결과를 반환한다.
IfStatement :
if
(
Expression
)
Statement
else
Statement
hasUndefinedLabels 를 첫 번째 Statement
에 iterationSet , « » 인수로 ContainsUndefinedContinueTarget 의
결과로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
두 번째 Statement
에 iterationSet , « » 인수로 ContainsUndefinedContinueTarget 의
결과를 반환한다.
IfStatement :
if
(
Expression
)
Statement
ContainsUndefinedContinueTarget
(Statement ,
iterationSet , « »)의 결과를 반환한다.
DoWhileStatement
:
do
Statement
while
(
Expression
)
;
ContainsUndefinedContinueTarget
(Statement ,
iterationSet , « »)의 결과를 반환한다.
WhileStatement :
while
(
Expression
)
Statement
ContainsUndefinedContinueTarget
(Statement ,
iterationSet , « »)의 결과를 반환한다.
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
ContainsUndefinedContinueTarget
(Statement ,
iterationSet , « »)의 결과를 반환한다.
ForInOfStatement
:
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
var
ForBinding
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
ContainsUndefinedContinueTarget
(Statement ,
iterationSet , « »)의 결과를 반환한다.
참고
ContinueStatement
:
continue
;
false 를 반환한다.
ContinueStatement
:
continue
LabelIdentifier
;
iterationSet 에 StringValue (LabelIdentifier )가
포함되어
있지 않으면
true 를 반환한다.
false 를 반환한다.
WithStatement :
with
(
Expression
)
Statement
ContainsUndefinedContinueTarget
(Statement ,
iterationSet , « »)의 결과를 반환한다.
SwitchStatement
:
switch
(
Expression
)
CaseBlock
ContainsUndefinedContinueTarget
(CaseBlock ,
iterationSet , « »)의 결과를 반환한다.
CaseBlock :
{
}
false 를 반환한다.
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
첫 번째 CaseClauses 가
있으면,
첫 번째 CaseClauses 에
iterationSet , « » 인수로 ContainsUndefinedContinueTarget 의
결과가 true 이면 true 를 반환한다.
DefaultClause 에
iterationSet , « » 인수로 ContainsUndefinedContinueTarget 의
결과가 true 이면 true 를 반환한다.
두 번째 CaseClauses 가
없으면
false 를 반환한다.
두 번째 CaseClauses 에
iterationSet , « » 인수로 ContainsUndefinedContinueTarget 의
결과를 반환한다.
CaseClauses :
CaseClauses
CaseClause
hasUndefinedLabels 를 ContainsUndefinedContinueTarget
(CaseClauses ,
iterationSet , « »)의 결과로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedContinueTarget
(CaseClause ,
iterationSet , « »)의 결과를 반환한다.
CaseClause :
case
Expression
:
StatementList opt
StatementList 가
있으면
ContainsUndefinedContinueTarget
(StatementList ,
iterationSet , « »)의 결과를 반환한다.
false 를 반환한다.
DefaultClause :
default
:
StatementList opt
StatementList 가
있으면
ContainsUndefinedContinueTarget
(StatementList ,
iterationSet , « »)의 결과를 반환한다.
false 를 반환한다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
label 을 StringValue (LabelIdentifier )로
한다.
newLabelSet 을 list-concatenation (labelSet ,
« label »)로 한다.
ContainsUndefinedContinueTarget
(LabelledItem ,
iterationSet , newLabelSet )의 결과를 반환한다.
LabelledItem :
FunctionDeclaration
false 를 반환한다.
TryStatement :
try
Block
Catch
hasUndefinedLabels 를 ContainsUndefinedContinueTarget
(Block ,
iterationSet , « »)의 결과로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedContinueTarget
(Catch ,
iterationSet , « »)의 결과를 반환한다.
TryStatement :
try
Block
Finally
hasUndefinedLabels 를 ContainsUndefinedContinueTarget
(Block ,
iterationSet , « »)의 결과로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedContinueTarget
(Finally ,
iterationSet , « »)의 결과를 반환한다.
TryStatement :
try
Block
Catch
Finally
ContainsUndefinedContinueTarget
(Block ,
iterationSet , « »)의 결과가 true 이면
true 를 반환한다.
ContainsUndefinedContinueTarget
(Catch ,
iterationSet , « »)의 결과가 true 이면
true 를 반환한다.
ContainsUndefinedContinueTarget
(Finally ,
iterationSet , « »)의 결과를 반환한다.
Catch :
catch
(
CatchParameter
)
Block
ContainsUndefinedContinueTarget
(Block ,
iterationSet , « »)의 결과를 반환한다.
FunctionStatementList
: [empty]
false 를 반환한다.
ClassStaticBlockStatementList
: [empty]
false 를 반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
hasUndefinedLabels 를 ContainsUndefinedContinueTarget
(ModuleItemList ,
iterationSet , « »)의 결과로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedContinueTarget
(ModuleItem ,
iterationSet , « »)의 결과를 반환한다.
ModuleItem :
ImportDeclaration
ExportDeclaration
false 를 반환한다.
8.4 함수 이름 추론
8.4.1 정적 의미론: HasName
구문 지향 연산
HasName은 인수를 받지 않으며 불리언을 반환한다. 다음 생성 규칙에 대해 조각별로 정의된다:
PrimaryExpression
: CoverParenthesizedExpressionAndArrowParameterList
expr 을 ParenthesizedExpression 로
한다.
이는 Cover 된 CoverParenthesizedExpressionAndArrowParameterList 이다.
IsFunctionDefinition 의
expr 값이 false 이면, false 를 반환한다.
expr 에 대한 HasName 의 값을 반환한다.
FunctionExpression
:
function
(
FormalParameters
)
{
FunctionBody
}
GeneratorExpression
:
function
*
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorExpression
:
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionExpression
:
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
ArrowFunction :
ArrowParameters
=>
ConciseBody
AsyncArrowFunction
:
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
ClassExpression
:
class
ClassTail
false 를 반환한다.
FunctionExpression
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
GeneratorExpression
:
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorExpression
:
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionExpression
:
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
ClassExpression
:
class
BindingIdentifier
ClassTail
true 를 반환한다.
8.4.2 정적 의미론: IsFunctionDefinition
구문 지향 연산
IsFunctionDefinition은 인수를 받지 않으며 불리언을 반환한다. 다음 생성 규칙에 대해 조각별로 정의된다:
PrimaryExpression
: CoverParenthesizedExpressionAndArrowParameterList
expr 을 ParenthesizedExpression 로
한다.
이는 Cover 된 CoverParenthesizedExpressionAndArrowParameterList 이다.
expr 에 대한 IsFunctionDefinition
값을 반환한다.
PrimaryExpression
:
this
IdentifierReference
Literal
ArrayLiteral
ObjectLiteral
RegularExpressionLiteral
TemplateLiteral
MemberExpression
:
MemberExpression
[
Expression
]
MemberExpression
.
IdentifierName
MemberExpression
TemplateLiteral
SuperProperty
MetaProperty
new
MemberExpression
Arguments
MemberExpression
.
PrivateIdentifier
NewExpression :
new
NewExpression
LeftHandSideExpression
:
CallExpression
OptionalExpression
UpdateExpression
:
LeftHandSideExpression
++
LeftHandSideExpression
--
++
UnaryExpression
--
UnaryExpression
UnaryExpression
:
delete
UnaryExpression
void
UnaryExpression
typeof
UnaryExpression
+
UnaryExpression
-
UnaryExpression
~
UnaryExpression
!
UnaryExpression
AwaitExpression
ExponentiationExpression
:
UpdateExpression
**
ExponentiationExpression
MultiplicativeExpression
:
MultiplicativeExpression
MultiplicativeOperator
ExponentiationExpression
AdditiveExpression
:
AdditiveExpression
+
MultiplicativeExpression
AdditiveExpression
-
MultiplicativeExpression
ShiftExpression
:
ShiftExpression
<<
AdditiveExpression
ShiftExpression
>>
AdditiveExpression
ShiftExpression
>>>
AdditiveExpression
RelationalExpression
:
RelationalExpression
<
ShiftExpression
RelationalExpression
>
ShiftExpression
RelationalExpression
<=
ShiftExpression
RelationalExpression
>=
ShiftExpression
RelationalExpression
instanceof
ShiftExpression
RelationalExpression
in
ShiftExpression
PrivateIdentifier
in
ShiftExpression
EqualityExpression
:
EqualityExpression
==
RelationalExpression
EqualityExpression
!=
RelationalExpression
EqualityExpression
===
RelationalExpression
EqualityExpression
!==
RelationalExpression
BitwiseANDExpression
:
BitwiseANDExpression
&
EqualityExpression
BitwiseXORExpression
:
BitwiseXORExpression
^
BitwiseANDExpression
BitwiseORExpression
:
BitwiseORExpression
|
BitwiseXORExpression
LogicalANDExpression
:
LogicalANDExpression
&&
BitwiseORExpression
LogicalORExpression
:
LogicalORExpression
||
LogicalANDExpression
CoalesceExpression
:
CoalesceExpressionHead
??
BitwiseORExpression
ConditionalExpression
:
ShortCircuitExpression
?
AssignmentExpression
:
AssignmentExpression
AssignmentExpression
:
YieldExpression
LeftHandSideExpression
=
AssignmentExpression
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
LeftHandSideExpression
&&=
AssignmentExpression
LeftHandSideExpression
||=
AssignmentExpression
LeftHandSideExpression
??=
AssignmentExpression
Expression :
Expression
,
AssignmentExpression
false 를 반환한다.
AssignmentExpression
:
ArrowFunction
AsyncArrowFunction
FunctionExpression
:
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
GeneratorExpression
:
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorExpression
:
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionExpression
:
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
ClassExpression
:
class
BindingIdentifier opt
ClassTail
true 를 반환한다.
8.4.3 정적 의미론: IsAnonymousFunctionDefinition (
expr )
추상 연산 IsAnonymousFunctionDefinition은 expr ( AssignmentExpression
파스
노드 , Initializer 파스
노드 , 또는 Expression 파스
노드 ) 인수를 받고 불리언을 반환한다. 이
연산은 인수가 이름을 바인딩하지 않는 함수 정의인지 판별한다. 호출 시 다음 단계를 수행한다:
IsFunctionDefinition
(expr )이 false 이면, false 를 반환한다.
hasName 을 HasName (expr )로
한다.
hasName 이 true 이면, false 를 반환한다.
true 를 반환한다.
8.4.4 정적 의미론: IsIdentifierRef
구문 지향 연산
IsIdentifierRef는 인수를 받지 않으며 불리언을 반환한다. 다음 생성 규칙에 대해 조각별로 정의된다:
PrimaryExpression
: IdentifierReference
true 를 반환한다.
PrimaryExpression
:
this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
CoverParenthesizedExpressionAndArrowParameterList
MemberExpression
:
MemberExpression
[
Expression
]
MemberExpression
.
IdentifierName
MemberExpression
TemplateLiteral
SuperProperty
MetaProperty
new
MemberExpression
Arguments
MemberExpression
.
PrivateIdentifier
NewExpression :
new
NewExpression
LeftHandSideExpression
:
CallExpression
OptionalExpression
false 를 반환한다.
8.4.5 실행 의미론: NamedEvaluation
구문 지향 연산
NamedEvaluation은 name ( 프로퍼티 키 또는 Private Name ) 인수를 받고
정상 완료 값을 포함한
함수
객체 또는
급작스런 완료 를 반환한다. 다음 생성
규칙에
대해 조각별로 정의된다:
PrimaryExpression
: CoverParenthesizedExpressionAndArrowParameterList
expr 을 ParenthesizedExpression 로
한다.
이는 Cover 된 CoverParenthesizedExpressionAndArrowParameterList 이다.
? NamedEvaluation (expr ,
name )의 결과를 반환한다.
ParenthesizedExpression
:
(
Expression
)
Assert :
IsAnonymousFunctionDefinition (Expression )이
true 이다.
? NamedEvaluation (Expression ,
name )의 결과를 반환한다.
FunctionExpression
:
function
(
FormalParameters
)
{
FunctionBody
}
InstantiateOrdinaryFunctionExpression
(FunctionExpression ,
name )의 결과를 반환한다.
GeneratorExpression
:
function
*
(
FormalParameters
)
{
GeneratorBody
}
InstantiateGeneratorFunctionExpression
(GeneratorExpression ,
name )의 결과를 반환한다.
AsyncGeneratorExpression
:
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
InstantiateAsyncGeneratorFunctionExpression
(AsyncGeneratorExpression ,
name )의 결과를 반환한다.
AsyncFunctionExpression
:
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
InstantiateAsyncFunctionExpression
(AsyncFunctionExpression ,
name )의 결과를 반환한다.
ArrowFunction :
ArrowParameters
=>
ConciseBody
InstantiateArrowFunctionExpression
(ArrowFunction ,
name )의 결과를 반환한다.
AsyncArrowFunction
:
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
InstantiateAsyncArrowFunctionExpression
(AsyncArrowFunction ,
name )의 결과를 반환한다.
ClassExpression
:
class
ClassTail
value 를 ? ClassDefinitionEvaluation (ClassTail ,
undefined , name )의 결과로 한다.
value .[[SourceText]] 를 source text
matched
by ClassExpression 로 설정한다.
value 를 반환한다.
8.5 포함(Contains)
8.5.1 정적 의미: 포함(Contains)
구문 지향 연산
Contains는 symbol (문법 심볼)을 인자로 받아 Boolean을 반환한다.
아래에 명시되지 않은 이 명세의 모든 문법 생성 alternative는 암묵적으로 다음과 같은 기본 Contains 정의를 가진다:
이 파스 노드(Parse Node) 의 각 자식 노드
child 에 대해, 다음을 수행한다:
child 가 symbol 의 인스턴스라면, true 를 반환한다.
child 가 비단말(nonterminal)의 인스턴스라면,
contained 를 child Contains
symbol 의 결과로 둔다.
contained 가 true 이면
true 를
반환한다.
false 를 반환한다.
FunctionDeclaration
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
FunctionExpression
:
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
GeneratorDeclaration
:
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
GeneratorExpression
:
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorDeclaration
:
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression
:
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionDeclaration
:
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
AsyncFunctionExpression
:
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
false 를 반환한다.
참고 1
하위 구조에 의존하는 정적 의미 규칙들은 일반적으로 함수 정의 내부를 들여다보지 않는다.
ClassTail :
ClassHeritage opt
{
ClassBody
}
symbol 이 ClassBody 라면, true 를
반환한다.
symbol 이 ClassHeritage 라면, 다음을 수행한다:
ClassHeritage 가 존재하면
true 를, 그렇지 않으면 false 를 반환한다.
ClassHeritage 가
존재하면,
다음을 수행한다:
ClassHeritage
Contains
symbol 이 true 라면 true 를 반환한다.
ClassBody 의 ComputedPropertyContains
결과를 symbol 인자로 반환한다.
참고 2
하위 구조에 의존하는 정적 의미 규칙들은 일반적으로 PropertyName 을 제외하고 클래스 바디 내부를 들여다보지
않는다.
ClassStaticBlock
:
static
{
ClassStaticBlockBody
}
false 를 반환한다.
참고 3
하위 구조에 의존하는 정적 의미 규칙들은 static 초기화 블록 내부를 일반적으로 들여다보지 않는다.
ArrowFunction :
ArrowParameters
=>
ConciseBody
symbol 이 NewTarget , SuperProperty , SuperCall ,
super, 또는 this 중 하나가 아니라면 false 를 반환한다.
ArrowParameters
Contains
symbol
이 true 라면, true 를 반환한다.
ConciseBody
Contains
symbol 의
결과를 반환한다.
ArrowParameters
:
CoverParenthesizedExpressionAndArrowParameterList
formals 를 ArrowFormalParameters 로 두는데,
이는
covered 된 CoverParenthesizedExpressionAndArrowParameterList 에서
나온다.
formals Contains
symbol 의
결과를 반환한다.
AsyncArrowFunction
:
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
symbol 이 NewTarget , SuperProperty , SuperCall ,
super, 또는 this 중 하나가 아니라면 false 를 반환한다.
AsyncConciseBody
Contains
symbol 의
결과를 반환한다.
AsyncArrowFunction
:
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
symbol 이 NewTarget , SuperProperty , SuperCall ,
super, 또는 this 중 하나가 아니라면 false 를 반환한다.
head 를 AsyncArrowHead 로 두는데, 이는 covered 된 CoverCallExpressionAndAsyncArrowHead 에서
나온다.
head Contains
symbol
이 true 라면, true 를 반환한다.
AsyncConciseBody
Contains
symbol 의
결과를 반환한다.
참고 4
Contains는 ArrowFunction 또는 AsyncArrowFunction
내에서 new.target, this, super 사용을 감지하는 데 사용된다.
PropertyDefinition
: MethodDefinition
symbol 이 MethodDefinition 라면
true 를 반환한다.
MethodDefinition 의
ComputedPropertyContains
결과를 symbol 인자로 반환한다.
LiteralPropertyName
: IdentifierName
false 를 반환한다.
MemberExpression
:
MemberExpression
.
IdentifierName
MemberExpression
Contains
symbol
이 true 라면, true 를 반환한다.
false 를 반환한다.
SuperProperty :
super
.
IdentifierName
symbol 이 ReservedWord super라면
true 를 반환한다.
false 를 반환한다.
CallExpression :
CallExpression
.
IdentifierName
CallExpression
Contains
symbol
이 true 라면, true 를 반환한다.
false 를 반환한다.
OptionalChain :
?.
IdentifierName
false 를 반환한다.
OptionalChain :
OptionalChain
.
IdentifierName
OptionalChain
Contains
symbol
이 true 라면, true 를 반환한다.
false 를 반환한다.
8.5.2 정적 의미: ComputedPropertyContains
구문 지향 연산
ComputedPropertyContains는 symbol (문법 심볼)을 인자로 받아 Boolean을 반환한다. 이 연산은 아래의 생성 규칙들에
대해
부분적으로 정의된다.
ClassElementName
:
PrivateIdentifier
PropertyName :
LiteralPropertyName
false 를 반환한다.
PropertyName :
ComputedPropertyName
ComputedPropertyName
Contains
symbol 의
결과를 반환한다.
MethodDefinition
:
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
get
ClassElementName
(
)
{
FunctionBody
}
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
ClassElementName 의
ComputedPropertyContains
결과를 symbol 인자로 반환한다.
GeneratorMethod
:
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
ClassElementName 의
ComputedPropertyContains
결과를 symbol 인자로 반환한다.
AsyncGeneratorMethod
:
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
ClassElementName 의
ComputedPropertyContains
결과를 symbol 인자로 반환한다.
ClassElementList
:
ClassElementList
ClassElement
inList 를 ClassElementList 의 ComputedPropertyContains
결과로 symbol 인자를 사용하여 구한다.
inList 가 true 라면, true 를 반환한다.
ClassElement 의
ComputedPropertyContains
결과를 symbol 인자로 반환한다.
ClassElement :
ClassStaticBlock
false 를 반환한다.
ClassElement :
;
false 를 반환한다.
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
ClassElementName 의
ComputedPropertyContains
결과를 symbol 인자로 반환한다.
FieldDefinition
:
ClassElementName
Initializer opt
ClassElementName 의
ComputedPropertyContains
결과를 symbol 인자로 반환한다.
8.6 기타
이 연산들은 명세 전반의 여러 곳에서 사용됩니다.
8.6.1 런타임 의미론: InstantiateFunctionObject
구문 지시 연산
InstantiateFunctionObject는 env (Environment Record )와
privateEnv (PrivateEnvironment Record 또는
null ) 인자를 받고, ECMAScript 함수 객체 를 반환합니다. 이는 다음 생성 규칙에 따라
부분적으로 정의됩니다:
FunctionDeclaration
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
InstantiateOrdinaryFunctionObject
를 FunctionDeclaration 에 대해
env 와 privateEnv 인자를 넣어 호출한 결과를 반환한다.
GeneratorDeclaration
:
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
InstantiateGeneratorFunctionObject
를 GeneratorDeclaration 에 대해
env 와 privateEnv 인자를 넣어 호출한 결과를 반환한다.
AsyncGeneratorDeclaration
:
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
InstantiateAsyncGeneratorFunctionObject
를 AsyncGeneratorDeclaration
에 대해 env 와 privateEnv 인자를 넣어 호출한 결과를 반환한다.
AsyncFunctionDeclaration
:
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
InstantiateAsyncFunctionObject
를 AsyncFunctionDeclaration 에
대해
env 와 privateEnv 인자를 넣어 호출한 결과를 반환한다.
8.6.2 런타임 의미론: BindingInitialization
구문 지시 연산
BindingInitialization은 value (ECMAScript 언어 값 )과
environment (Environment Record 또는
undefined ) 인자를 받고, unused를 포함하는 정상
완료 또는 비정상 완료
중
하나를 반환한다.
참고
environment 에 undefined 가 전달되는 것은 초기화 값을 할당할 때 PutValue
연산을
사용해야 함을 나타낸다. 이는 var 문과 일부 비엄격 함수 의 명시적 매개변수
목록(자세한
내용은 10.2.11 참고)에
해당한다.
이런 경우 렉시컬 바인딩이 호이스팅되고, 초기화식이 평가되기 전에 미리 초기화된다.
다음 생성 규칙에 따라 부분적으로 정의된다:
BindingIdentifier
: Identifier
name 을 StringValue of
Identifier 로 둔다.
? InitializeBoundName (name ,
value , environment )를 반환한다.
BindingIdentifier
: yield
? InitializeBoundName ("yield" ,
value , environment )를 반환한다.
BindingIdentifier
: await
? InitializeBoundName ("await" ,
value , environment )를 반환한다.
BindingPattern :
ObjectBindingPattern
? RequireObjectCoercible (value )를
수행한다.
? BindingInitialization of ObjectBindingPattern 를
value , environment 인자로 호출한 결과를 반환한다.
BindingPattern :
ArrayBindingPattern
iteratorRecord 를 ? GetIterator (value ,
sync )로 둔다.
result 를 Completion (IteratorBindingInitialization of ArrayBindingPattern
를 iteratorRecord , environment 인자로 호출)로 둔다.
만약 iteratorRecord .[[Done]] 이
false 라면, ? IteratorClose (iteratorRecord ,
result )를 반환한다.
? result 를 반환한다.
ObjectBindingPattern
:
{
}
unused 를 반환한다.
ObjectBindingPattern
:
{
BindingPropertyList
}
{
BindingPropertyList
,
}
? PropertyBindingInitialization of BindingPropertyList
를 value , environment 인자로 호출한다.
unused 를 반환한다.
ObjectBindingPattern
:
{
BindingRestProperty
}
excludedNames 를 새로운 빈 List 로 둔다.
? RestBindingInitialization of BindingRestProperty
를 value , environment , excludedNames 인자로 호출한 결과를
반환한다.
ObjectBindingPattern
:
{
BindingPropertyList
,
BindingRestProperty
}
excludedNames 를 ? PropertyBindingInitialization of BindingPropertyList
를 value , environment 인자로 호출한 결과로 둔다.
? RestBindingInitialization of BindingRestProperty
를 value , environment , excludedNames 인자로 호출한 결과를
반환한다.
8.6.2.1 InitializeBoundName ( name ,
value ,
environment )
추상 연산 InitializeBoundName은 name (문자열),
value (ECMAScript 언어 값 ), 그리고
environment (Environment Record 또는
undefined ) 인자를 받고, unused를 포함하는 정상
완료
또는 비정상 완료 중 하나를
반환한다.
다음 단계를 수행한다:
만약 environment 가 undefined 가 아니라면,
! environment .InitializeBinding(name ,
value )을 수행한다.
unused 를 반환한다.
그 외의 경우,
lhs 를 ? ResolveBinding (name )로
둔다.
? PutValue (lhs ,
value )를 반환한다.
8.6.3 런타임 의미론: IteratorBindingInitialization
구문 지시 연산
IteratorBindingInitialization은
iteratorRecord (Iterator Record 타입)와
environment
(Environment Record 또는
undefined ) 인자를 받고, unused를 포함하는 정상
완료 또는 비정상 완료
중
하나를 반환한다.
참고
environment 에 undefined 가 전달될 경우, 초기화 값 할당에 PutValue
연산을
사용해야 함을 나타낸다. 이는 비엄격 함수 의 명시적 매개변수 목록에 해당한다. 이 경우
동일한
이름의 매개변수가 여러 개 있을 수 있으므로, 명시적 매개변수 바인딩을 미리 초기화한다.
다음 생성 규칙에 따라 부분적으로 정의된다:
ArrayBindingPattern
:
[
]
unused 를 반환한다.
ArrayBindingPattern
:
[
Elision
]
? IteratorDestructuringAssignmentEvaluation
of
Elision 에
iteratorRecord 인자를 넣어 호출한 결과를 반환한다.
ArrayBindingPattern
:
[
Elision opt
BindingRestElement
]
만약 Elision 이 존재한다면,
? IteratorDestructuringAssignmentEvaluation
of Elision 에
iteratorRecord 인자를 넣어 호출한다.
? IteratorBindingInitialization of BindingRestElement
에 iteratorRecord , environment 인자를 넣어 호출한 결과를 반환한다.
ArrayBindingPattern
:
[
BindingElementList
,
Elision
]
? IteratorBindingInitialization of BindingElementList
에 iteratorRecord , environment 인자를 넣어 호출한다.
? IteratorDestructuringAssignmentEvaluation
of
Elision 에
iteratorRecord 인자를 넣어 호출한 결과를 반환한다.
ArrayBindingPattern
:
[
BindingElementList
,
Elision opt
BindingRestElement
]
? IteratorBindingInitialization of BindingElementList
에 iteratorRecord , environment 인자를 넣어 호출한다.
만약 Elision 이 존재한다면,
? IteratorDestructuringAssignmentEvaluation
of Elision 에
iteratorRecord 인자를 넣어 호출한다.
? IteratorBindingInitialization of BindingRestElement
에 iteratorRecord , environment 인자를 넣어 호출한 결과를 반환한다.
BindingElementList
:
BindingElementList
,
BindingElisionElement
? IteratorBindingInitialization of BindingElementList
에 iteratorRecord , environment 인자를 넣어 호출한다.
? IteratorBindingInitialization of BindingElisionElement 에
iteratorRecord , environment 인자를 넣어 호출한 결과를 반환한다.
BindingElisionElement
:
Elision
BindingElement
? IteratorDestructuringAssignmentEvaluation
of
Elision 에
iteratorRecord 인자를 넣어 호출한다.
? IteratorBindingInitialization of BindingElement 에
iteratorRecord , environment 인자를 넣어 호출한 결과를 반환한다.
SingleNameBinding
:
BindingIdentifier
Initializer opt
bindingId 를 StringValue of
BindingIdentifier 로
둔다.
lhs 를 ? ResolveBinding (bindingId ,
environment )로 둔다.
v 를 undefined 로 둔다.
만약 iteratorRecord .[[Done]] 이
false 라면,
next 를 ? IteratorStepValue (iteratorRecord )로
둔다.
만약 next 가 done 이 아니라면,
v 에 next 를 할당한다.
만약 Initializer 가
존재하고
v 가 undefined 라면,
만약 IsAnonymousFunctionDefinition (Initializer )가
true 라면,
v 에 ? NamedEvaluation of
Initializer
를 bindingId 인자로 호출한 결과를 할당한다.
그 외의 경우,
defaultValue 를 ? Evaluation of Initializer 로 둔다.
v 에 ? GetValue (defaultValue )를
할당한다.
만약 environment 가 undefined 라면, ? PutValue (lhs , v )를
반환한다.
? InitializeReferencedBinding (lhs ,
v )를 반환한다.
BindingElement :
BindingPattern
Initializer opt
v 를 undefined 로 둔다.
만약 iteratorRecord .[[Done]] 이
false 라면,
next 를 ? IteratorStepValue (iteratorRecord )로
둔다.
만약 next 가 done 이 아니라면,
v 에 next 를 할당한다.
만약 Initializer 가
존재하고
v 가 undefined 라면,
defaultValue 를 ? Evaluation of
Initializer 로
둔다.
v 에 ? GetValue (defaultValue )를
할당한다.
? BindingInitialization of BindingPattern 에
v , environment 인자를 넣어 호출한 결과를 반환한다.
BindingRestElement
:
...
BindingIdentifier
lhs 를 ? ResolveBinding (StringValue of
BindingIdentifier ,
environment )로 둔다.
A 를 ! ArrayCreate (0)로 둔다.
n 을 0으로 둔다.
반복,
next 를 done 으로 둔다.
만약 iteratorRecord .[[Done]] 이
false 라면,
next 를 ? IteratorStepValue (iteratorRecord )로
둔다.
만약 next 가 done 이라면,
만약 environment 가 undefined 라면,
? PutValue (lhs ,
A )를 반환한다.
? InitializeReferencedBinding (lhs ,
A )를 반환한다.
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (n )),
next ))를 수행한다.
n 을 n + 1로 갱신한다.
BindingRestElement
:
...
BindingPattern
A 를 ! ArrayCreate (0)로 둔다.
n 을 0으로 둔다.
반복,
next 를 done 으로 둔다.
만약 iteratorRecord .[[Done]] 이
false 라면,
next 를 ? IteratorStepValue (iteratorRecord )로
둔다.
만약 next 가 done 이라면,
? BindingInitialization of
BindingPattern 에
A , environment 인자를 넣어 호출한 결과를 반환한다.
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (n )),
next ))를 수행한다.
n 을 n + 1로 갱신한다.
FormalParameters
:
[empty]
unused 를 반환한다.
FormalParameters
:
FormalParameterList
,
FunctionRestParameter
? IteratorBindingInitialization of FormalParameterList
에 iteratorRecord , environment 인자를 넣어 호출한다.
? IteratorBindingInitialization of FunctionRestParameter 에
iteratorRecord , environment 인자를 넣어 호출한 결과를 반환한다.
FormalParameterList
:
FormalParameterList
,
FormalParameter
? IteratorBindingInitialization of FormalParameterList
에 iteratorRecord , environment 인자를 넣어 호출한다.
? IteratorBindingInitialization of FormalParameter 에
iteratorRecord , environment 인자를 넣어 호출한 결과를 반환한다.
ArrowParameters
:
BindingIdentifier
v 를 undefined 로 둔다.
Assert :
iteratorRecord .[[Done]] 이
false 임을
보장한다.
next 를 ? IteratorStepValue (iteratorRecord )로
둔다.
만약 next 가 done 이 아니라면,
v 에 next 를 할당한다.
? BindingInitialization of BindingIdentifier
에 v , environment 인자를 넣어 호출한 결과를 반환한다.
ArrowParameters
:
CoverParenthesizedExpressionAndArrowParameterList
formals 를 ArrowFormalParameters 로 두는데,
이는 covered by CoverParenthesizedExpressionAndArrowParameterList 에
해당한다.
? IteratorBindingInitialization of
formals 에 iteratorRecord , environment 인자를 넣어 호출한 결과를
반환한다.
AsyncArrowBindingIdentifier
: BindingIdentifier
v 를 undefined 로 둔다.
Assert :
iteratorRecord .[[Done]] 이
false 임을
보장한다.
next 를 ? IteratorStepValue (iteratorRecord )로
둔다.
만약 next 가 done 이 아니라면,
v 에 next 를 할당한다.
? BindingInitialization of BindingIdentifier
에 v , environment 인자를 넣어 호출한 결과를 반환한다.
8.6.4 정적 의미론: AssignmentTargetType
구문 지시 연산
AssignmentTargetType은 인자를 받지 않으며,
simple , web-compat , 또는
invalid 중 하나를 반환한다. 이는 다음 생성 규칙에 따라 부분적으로 정의된다:
IdentifierReference
: Identifier
만약 IsStrict (이 IdentifierReference )가
true 이고, StringValue of
Identifier 가
"eval" 또는 "arguments" 인 경우,
invalid 를 반환한다.
simple 를 반환한다.
IdentifierReference
:
yield
await
CallExpression :
CallExpression
[
Expression
]
CallExpression
.
IdentifierName
CallExpression
.
PrivateIdentifier
MemberExpression
:
MemberExpression
[
Expression
]
MemberExpression
.
IdentifierName
SuperProperty
MemberExpression
.
PrivateIdentifier
simple 를 반환한다.
PrimaryExpression
:
CoverParenthesizedExpressionAndArrowParameterList
expr 을 ParenthesizedExpression 로
두는데,
이는 covered by CoverParenthesizedExpressionAndArrowParameterList 에
해당한다.
expr 의 AssignmentTargetType 을
반환한다.
CallExpression :
CoverCallExpressionAndAsyncArrowHead
CallExpression
Arguments
만약
host 가 웹 브라우저이거나
함수
호출 할당 대상에 대한 런타임 오류 를 지원하고,
IsStrict (이
CallExpression )가
false 라면,
web-compat 를 반환한다.
invalid 를 반환한다.
PrimaryExpression
:
this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
CallExpression :
SuperCall
ImportCall
CallExpression
TemplateLiteral
NewExpression :
new
NewExpression
MemberExpression
:
MemberExpression
TemplateLiteral
new
MemberExpression
Arguments
NewTarget :
new
.
target
ImportMeta :
import
.
meta
LeftHandSideExpression
:
OptionalExpression
UpdateExpression
:
LeftHandSideExpression
++
LeftHandSideExpression
--
++
UnaryExpression
--
UnaryExpression
UnaryExpression
:
delete
UnaryExpression
void
UnaryExpression
typeof
UnaryExpression
+
UnaryExpression
-
UnaryExpression
~
UnaryExpression
!
UnaryExpression
AwaitExpression
ExponentiationExpression
:
UpdateExpression
**
ExponentiationExpression
MultiplicativeExpression
:
MultiplicativeExpression
MultiplicativeOperator
ExponentiationExpression
AdditiveExpression
:
AdditiveExpression
+
MultiplicativeExpression
AdditiveExpression
-
MultiplicativeExpression
ShiftExpression
:
ShiftExpression
<<
AdditiveExpression
ShiftExpression
>>
AdditiveExpression
ShiftExpression
>>>
AdditiveExpression
RelationalExpression
:
RelationalExpression
<
ShiftExpression
RelationalExpression
>
ShiftExpression
RelationalExpression
<=
ShiftExpression
RelationalExpression
>=
ShiftExpression
RelationalExpression
instanceof
ShiftExpression
RelationalExpression
in
ShiftExpression
PrivateIdentifier
in
ShiftExpression
EqualityExpression
:
EqualityExpression
==
RelationalExpression
EqualityExpression
!=
RelationalExpression
EqualityExpression
===
RelationalExpression
EqualityExpression
!==
RelationalExpression
BitwiseANDExpression
:
BitwiseANDExpression
&
EqualityExpression
BitwiseXORExpression
:
BitwiseXORExpression
^
BitwiseANDExpression
BitwiseORExpression
:
BitwiseORExpression
|
BitwiseXORExpression
LogicalANDExpression
:
LogicalANDExpression
&&
BitwiseORExpression
LogicalORExpression
:
LogicalORExpression
||
LogicalANDExpression
CoalesceExpression
:
CoalesceExpressionHead
??
BitwiseORExpression
ConditionalExpression
:
ShortCircuitExpression
?
AssignmentExpression
:
AssignmentExpression
AssignmentExpression
:
YieldExpression
ArrowFunction
AsyncArrowFunction
LeftHandSideExpression
=
AssignmentExpression
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
LeftHandSideExpression
&&=
AssignmentExpression
LeftHandSideExpression
||=
AssignmentExpression
LeftHandSideExpression
??=
AssignmentExpression
Expression :
Expression
,
AssignmentExpression
invalid 를 반환한다.
8.6.5 정적 의미론: PropName
구문 지시 연산
PropName은 인자를 받지 않으며, 문자열 또는 empty 를 반환한다. 이는 다음 생성 규칙에 따라 부분적으로 정의된다:
PropertyDefinition
: IdentifierReference
IdentifierReference 의 StringValue 를 반환한다.
PropertyDefinition
:
...
AssignmentExpression
empty 를 반환한다.
PropertyDefinition
:
PropertyName
:
AssignmentExpression
PropertyName 의
PropName 을 반환한다.
LiteralPropertyName
: IdentifierName
AttributeKey :
IdentifierName
IdentifierName 의
StringValue 를 반환한다.
LiteralPropertyName
: StringLiteral
AttributeKey :
StringLiteral
StringLiteral 의
SV 를
반환한다.
LiteralPropertyName
: NumericLiteral
nbr 를 NumericLiteral 의 NumericValue 로 둔다.
! ToString (nbr )을 반환한다.
ComputedPropertyName
:
[
AssignmentExpression
]
empty 를 반환한다.
MethodDefinition
:
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
get
ClassElementName
(
)
{
FunctionBody
}
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
ClassElementName 의
PropName 을 반환한다.
GeneratorMethod
:
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
ClassElementName 의
PropName 을 반환한다.
AsyncGeneratorMethod
:
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
ClassElementName 의
PropName 을 반환한다.
ClassElement :
ClassStaticBlock
empty 를 반환한다.
ClassElement :
;
empty 를 반환한다.
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
ClassElementName 의
PropName 을 반환한다.
FieldDefinition
:
ClassElementName
Initializer opt
ClassElementName 의
PropName 을 반환한다.
ClassElementName
:
PrivateIdentifier
empty 를 반환한다.
9 실행 가능한 코드와 실행 컨텍스트
9.1 환경 레코드
Environment Record 는 ECMAScript 코드의 렉시컬 중첩
구조에
기반하여 Identifier 들을 특정 변수와 함수에
연관시키기
위해 사용되는 명세 타입입니다. 보통 환경 레코드는 FunctionDeclaration , BlockStatement , 또는 Catch 절과 같이 ECMAScript 코드의 특정 구문 구조와
연결됩니다.
이와 같은 코드가 평가될 때마다, 해당 코드가 생성하는 식별자 바인딩을 기록하기 위해 새로운 환경 레코드가 생성됩니다.
모든 환경 레코드는 [[OuterEnv]] 필드를 가지며, 이 값은 null 이거나 외부 환경
레코드를
참조합니다. 이 필드는 환경 레코드 값들의 논리적 중첩 구조를 모델링하는 데 사용됩니다. (내부) 환경 레코드의 외부 참조는 논리적으로 그 내부 환경 레코드를 둘러싸는 환경
레코드를 참조합니다. 외부 환경 레코드는 물론 그 자체로 또 다른 외부 환경 레코드를 가질 수 있습니다. 하나의 환경 레코드는 여러 내부 환경 레코드의 외부 환경이 될 수
있습니다. 예를 들어, FunctionDeclaration 이 두 개의 중첩된 FunctionDeclaration 을 포함한다면,
각
중첩 함수의 환경 레코드는 현재 평가 중인 외부 함수의 환경 레코드를 외부 환경 레코드로 갖게 됩니다.
환경 레코드는 오직 명세상의 메커니즘일 뿐이며, ECMAScript 구현의 어떤 특정 산출물과 반드시 대응할 필요는 없습니다. ECMAScript 프로그램이 이러한 값을
직접적으로
접근하거나 조작하는 것은 불가능합니다.
9.1.1 환경 레코드 타입 계층
환경
레코드 는 Environment Record 가 추상 클래스이고, 세 가지
구체적 하위
클래스를 가지는 단순한 객체 지향 계층으로 생각할 수 있습니다: 선언적 환경 레코드 ,
객체 환경 레코드 , 그리고 전역 환경 레코드 . 함수 환경 레코드 와 모듈 환경 레코드 는 선언적 환경 레코드 의 하위 클래스입니다.
환경
레코드 추상 클래스에는 표 16 에 정의된 추상 명세
메서드가 포함되어 있습니다. 이 추상 메서드들은 각 구체적 하위 클래스마다 서로 다른 구체적 알고리즘을 가집니다.
표 16: 환경 레코드 의 추상 메서드
메서드
목적
HasBinding(N)
환경 레코드 가 문자열 값
N 에 대한 바인딩을 가지고 있는지 확인합니다. 가지고 있다면 true 를,
아니라면
false 를 반환합니다.
CreateMutableBinding(N, D)
환경 레코드 에 새로운(아직
초기화되지
않은) 변경 가능한 바인딩을 생성합니다. 문자열 값 N 은 바인딩될 이름의 텍스트입니다. 불리언 인자
D 가 true 라면, 이 바인딩은 이후 삭제될 수 있습니다.
CreateImmutableBinding(N, S)
환경 레코드 에 새로운(아직
초기화되지
않은) 변경 불가능한 바인딩을 생성합니다. 문자열 값 N 은 바인딩될 이름의 텍스트입니다.
S 가
true 라면, 초기화 후 값을 설정하려는 시도는 엄격 모드 여부와 관계없이 항상 예외를
발생시킵니다.
InitializeBinding(N, V)
환경 레코드 에 이미 존재하지만
아직
초기화되지 않은 바인딩의 값을 설정합니다. 문자열 값 N 은 바인딩될 이름의 텍스트입니다.
V 는
바인딩에 대한 값이며, ECMAScript
언어
타입 의 값입니다.
SetMutableBinding(N, V, S)
환경 레코드 에 이미 존재하는
변경
가능한 바인딩의 값을 설정합니다. 문자열 값 N 은 바인딩될 이름의 텍스트입니다. V 는
바인딩에
대한 값이며, ECMAScript
언어
타입 의 값일 수 있습니다. S 는 불리언
플래그입니다. S 가 true 이며 바인딩에 값을 설정할 수 없으면
TypeError 예외를 발생시킵니다.
GetBindingValue(N, S)
환경 레코드 에서 이미 존재하는
바인딩의
값을 반환합니다. 문자열 값 N 은 바인딩될 이름의 텍스트입니다. S 는 엄격 모드 코드 에서 시작되었거나 엄격
모드
참조语 의미가 요구되는 참조를 식별하는 데 사용됩니다. S 가 true 이고
바인딩이
존재하지 않으면 ReferenceError 예외를 발생시킵니다. 바인딩이 존재하지만 초기화되지
않았다면
S 의 값과 상관없이 ReferenceError 가 발생합니다.
DeleteBinding(N)
환경 레코드 에서 바인딩을
삭제합니다.
문자열 값 N 은 바인딩될 이름의 텍스트입니다. N 에 대한 바인딩이 존재하면 해당 바인딩을
제거하고
true 를 반환합니다. 바인딩이 존재하나 삭제할 수 없는 경우
false 를 반환합니다. 바인딩이 존재하지 않으면 true 를
반환합니다.
HasThisBinding()
환경 레코드 가
this 바인딩을 설정하는지 확인합니다. 그렇다면 true , 아니라면
false 를 반환합니다.
HasSuperBinding()
환경 레코드 가
super 메서드 바인딩을 설정하는지 확인합니다. 그렇다면 true ,
아니라면
false 를 반환합니다. true 를 반환한다면
환경 레코드 가 함수 환경
레코드 임을
의미하지만, 그 역은 성립하지 않습니다.
WithBaseObject()
이 환경 레코드 가
with 문과 연관되어 있다면, with 객체를 반환합니다. 그렇지 않으면
undefined 를 반환합니다.
9.1.1.1 선언적 환경 레코드
각 선언적 환경 레코드 는 변수, 상수,
let, class, module, import, 그리고/또는 함수 선언을 포함하는 ECMAScript 프로그램 스코프와 연관되어 있습니다. 선언적 환경
레코드는 그
스코프 내에 포함된 선언들이 정의하는 식별자 집합을 바인딩합니다.
9.1.1.1.1 HasBinding ( N )
선언적 환경 레코드
envRec 의 HasBinding 구체 메서드는 N (문자열)을 인자로 받아 불리언을 포함하는 정상
완료 를
반환합니다. 이 메서드는 인자로 받은 식별자가 레코드에 바인딩된 식별자 중 하나인지 판단합니다. 호출 시 다음 단계를 수행합니다:
envRec 가 N 에 대한 바인딩을 가지고 있다면 true 를
반환한다.
false 를 반환한다.
9.1.1.1.2 CreateMutableBinding ( N ,
D
)
선언적 환경 레코드
envRec 의 CreateMutableBinding 구체 메서드는 N (문자열)과 D
(불리언)를
인자로 받아 unused를 포함하는 정상
완료 를 반환합니다. 이름 N 에 대해 초기화되지 않은 새로운 변경 가능한 바인딩을
생성합니다. 이
환경 레코드 내에 N 에 대한
바인딩이
이미 존재해서는 안 됩니다. D 가 true 이면, 새로 생성된 바인딩은 삭제 대상임이 표시됩니다.
호출 시
다음 단계를 수행합니다:
Assert :
envRec 가 이미 N 에 대한 바인딩을 가지고 있지 않음을 보장한다.
envRec 에 대해 N 에 대한 변경 가능한 바인딩을 생성하고, 초기화되지 않았음을 기록한다.
D 가 true 이면, 새로 생성된 바인딩이 이후 DeleteBinding 호출로
삭제될 수
있음을 기록한다.
unused 를 반환한다.
9.1.1.1.3 CreateImmutableBinding ( N ,
S )
선언적 환경 레코드
envRec 의 CreateImmutableBinding 구체 메서드는 N (문자열)과 S
(불리언)를 인자로 받아 unused를 포함하는
정상
완료 를 반환합니다. 이름 N 에 대해 초기화되지 않은 새로운 변경 불가능한 바인딩을
생성합니다. 이
환경 레코드 내에 N 에 대한
바인딩이
이미 존재해서는 안 됩니다. S 가 true 이면, 새로 생성된 바인딩이 strict 바인딩임을
표시합니다.
호출 시 다음 단계를 수행합니다:
Assert :
envRec 가 이미 N 에 대한 바인딩을 가지고 있지 않음을 보장한다.
envRec 에 대해 N 에 대한 변경 불가능한 바인딩을 생성하고, 초기화되지 않았음을 기록한다.
S 가 true 이면, 새로 생성된 바인딩이 strict 바인딩임을 기록한다.
unused 를 반환한다.
9.1.1.1.4 InitializeBinding ( N , V
)
선언적 환경 레코드
envRec 의 InitializeBinding 구체 메서드는 N (문자열)과 V
(ECMAScript 언어 값 )를 인자로
받아
unused를 포함하는 정상
완료 를 반환합니다. 이 메서드는 이름이 N 인 식별자의 현재 바인딩의 값을
V 로
설정합니다. N 에 대한 초기화되지 않은 바인딩이 이미 존재해야 합니다. 호출 시 다음 단계를 수행합니다:
Assert :
envRec 에 N 에 대한 초기화되지 않은 바인딩이 존재함을 보장한다.
envRec 내 N 에 대한 바인딩 값을 V 로 설정한다.
envRec 내 N 에 대한 바인딩이 초기화되었음을 기록한다.
unused 를 반환한다.
9.1.1.1.5 SetMutableBinding ( N ,
V ,
S )
선언적 환경 레코드
envRec 의 SetMutableBinding 구체 메서드는 N (문자열), V
(ECMAScript 언어 값 ),
S (불리언)를 인자로 받아 unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 이름이 N 인 식별자의 현재 바인딩의 값을
V 로 변경하려고 시도합니다. N 에 대한 바인딩이 보통 이미 존재하지만, 드물게 존재하지 않을 수도 있습니다.
바인딩이
변경 불가능한 경우 S 가 true 이면 TypeError 를
발생시킵니다.
호출 시 다음 단계를 수행합니다:
만약 envRec 에
N 에
대한 바인딩이 존재하지 않는다면,
S 가 true 이면
ReferenceError 예외를 발생시킨다.
! envRec .CreateMutableBinding(N ,
true )을 수행한다.
! envRec .InitializeBinding(N ,
V )을
수행한다.
unused 를 반환한다.
envRec 내 N 에 대한 바인딩이 strict 바인딩이라면, S 를
true 로 설정한다.
envRec 내 N 에 대한 바인딩이 아직 초기화되지 않았다면,
ReferenceError 예외를 발생시킨다.
그 외에 envRec 내 N 에 대한 바인딩이 변경 가능한 바인딩이라면,
그 값을 V 로 변경한다.
그 외의 경우,
Assert : 이는 변경 불가능한 바인딩의 값을
변경하려는
시도임을 보장한다.
S 가 true 이면 TypeError
예외를
발생시킨다.
unused 를 반환한다.
참고
다음과 같은 ECMAScript 코드는 1 단계에서
바인딩이 존재하지 않게 되는 결과를 초래할 수 있습니다:
function f ( ) { eval ("var x; x = (delete x, 0);" ); }
9.1.1.1.6 GetBindingValue ( N , S )
선언적 환경 레코드
envRec 의 GetBindingValue 구체 메서드는 N (문자열)과 S (불리언)를
인자로
받아 ECMAScript 언어 값을 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 이름이 N 인 바인딩된 식별자의 값을
반환합니다.
바인딩이 존재하지만 아직 초기화되지 않았다면 S 값과 무관하게 ReferenceError 예외가
발생합니다. 호출 시 다음 단계를 수행합니다:
Assert :
envRec 가 N 에 대한 바인딩을 가지고 있음을 보장한다.
envRec 내 N 에 대한 바인딩이 초기화되지 않았다면
ReferenceError 예외를 발생시킨다.
envRec 내 N 에 현재 바인딩된 값을 반환한다.
9.1.1.1.7 DeleteBinding ( N )
선언적 환경 레코드
envRec 의 DeleteBinding 구체 메서드는 N (문자열)을 인자로 받아 불리언을 포함하는 정상
완료 를
반환합니다. 이 메서드는 삭제 대상임이 명시적으로 지정된 바인딩만 삭제할 수 있습니다. 호출 시 다음 단계를 수행합니다:
Assert :
envRec 가 N 에 대한 바인딩을 가지고 있음을 보장한다.
envRec 내 N 에 대한 바인딩을 삭제할 수 없다면
false 를
반환한다.
envRec 에서 N 에 대한 바인딩을 제거한다.
true 를 반환한다.
9.1.1.1.8 HasThisBinding ( )
선언적 환경 레코드
envRec 의 HasThisBinding 구체 메서드는 인자가 없으며 false 를 반환합니다.
호출 시
다음 단계를 수행합니다:
false 를 반환한다.
참고
일반적인 선언적 환경
레코드
(즉, 함수 환경 레코드 나
모듈 환경 레코드 가 아닌
것)는
this 바인딩을 제공하지 않습니다.
9.1.1.1.9 HasSuperBinding ( )
선언적 환경 레코드
envRec 의 HasSuperBinding 구체 메서드는 인자가 없으며 false 를 반환합니다.
호출 시
다음 단계를 수행합니다:
false 를 반환한다.
참고
일반적인 선언적 환경
레코드
(즉, 함수 환경 레코드 나
모듈 환경 레코드 가 아닌
것)는
super 바인딩을 제공하지 않습니다.
9.1.1.1.10 WithBaseObject ( )
선언적 환경 레코드
envRec 의 WithBaseObject 구체 메서드는 인자가 없으며 undefined 를
반환합니다.
호출 시 다음 단계를 수행합니다:
undefined 를 반환한다.
9.1.1.2 객체 환경 레코드
각 객체 환경 레코드 는 자신의 바인딩
객체 라 불리는 객체와 연관되어 있습니다. 객체 환경 레코드는 바인딩 객체의 프로퍼티 이름에 직접적으로 대응하는 문자열 식별자 이름 집합을
바인딩합니다. 프로퍼티
키 중 IdentifierName 형태의 문자열이 아닌 것들은 바인딩된 식별자
집합에
포함되지 않습니다. 자신의 [[Enumerable]] 특성 설정과 상관없이 소유 및 상속된 프로퍼티 모두 집합에
포함됩니다. 객체에 프로퍼티가 동적으로 추가되거나 삭제될 수 있기 때문에, 객체 환경 레코드에 바인딩된 식별자 집합은 프로퍼티 추가/삭제 연산의 부수 효과로
잠재적으로 변경될 수 있습니다. 이런 부수 효과로 생성된 모든 바인딩은 해당 프로퍼티의 Writable 특성이
false 이어도 변경
가능한 바인딩으로 간주합니다. 객체 환경 레코드에는 변경 불가능한(immutable) 바인딩이 존재하지 않습니다.
with 문(14.11 )을 위해 생성된 객체 환경 레코드는 바인딩 객체를 함수
호출에서
암시적 this 값으로 제공할 수 있습니다. 이 기능은 불리언 타입의 [[IsWithEnvironment]] 필드로 제어됩니다.
객체 환경 레코드는 표
17 에 나열된 추가 상태 필드를 가집니다.
표 17: 객체 환경 레코드 의 추가 필드
필드 이름
값
의미
[[BindingObject]]
객체
이 환경 레코드 의 바인딩
객체.
[[IsWithEnvironment]]
불리언
이 환경 레코드 가
with 문을 위해 생성된 것인지를 나타냅니다.
9.1.1.2.1 HasBinding ( N )
객체 환경 레코드
envRec 의 HasBinding 구체 메서드는 N (문자열)을 인자로 받아 불리언을 포함하는 정상
완료
또는 throw
completion 을 반환합니다. 이 메서드는 연관된 바인딩 객체에 N 이라는 이름의
프로퍼티가
존재하는지 판단합니다. 호출 시 다음 단계를 수행합니다:
bindingObject 를 envRec .[[BindingObject]] 로 둔다.
foundBinding 를 ? HasProperty (bindingObject ,
N )로 둔다.
foundBinding 이 false 라면
false 를
반환한다.
envRec .[[IsWithEnvironment]] 가
false 라면 true 를 반환한다.
unscopables 를 ? Get (bindingObject ,
%Symbol.unscopables% )로
둔다.
unscopables 가 객체 라면,
blocked 를 ToBoolean (? Get (unscopables ,
N ))로 둔다.
blocked 가 true 라면
false 를
반환한다.
true 를 반환한다.
9.1.1.2.2 CreateMutableBinding ( N ,
D
)
객체 환경 레코드
envRec 의 CreateMutableBinding 구체 메서드는 N (문자열)과 D
(불리언)를
인자로 받아 unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 환경
레코드 와 연관된 바인딩 객체에 N 이라는 이름의 프로퍼티를 생성하고, 그 값을
undefined 로 초기화합니다. D 가 true 면 새 프로퍼티의
[[Configurable]] 특성을 true 로, 아니면
false 로 설정합니다. 호출 시 다음 단계를 수행합니다:
bindingObject 를 envRec .[[BindingObject]] 로 둔다.
? DefinePropertyOrThrow (bindingObject ,
N , PropertyDescriptor { [[Value]] :
undefined , [[Writable]] :
true , [[Enumerable]] :
true , [[Configurable]] :
D })를 수행한다.
unused 를 반환한다.
참고
보통 envRec 는 N 에 대한 바인딩을 갖지 않지만, 만약 갖고 있다면 DefinePropertyOrThrow 의
의미론에 따라 기존 바인딩이 대체되거나 가려지거나, 비정상
완료 가
반환될 수 있습니다.
9.1.1.2.3 CreateImmutableBinding ( N ,
S )
객체 환경 레코드 의
CreateImmutableBinding 구체 메서드는 이 명세 안에서 사용되지 않습니다.
9.1.1.2.4 InitializeBinding ( N , V
)
객체 환경 레코드
envRec 의 InitializeBinding 구체 메서드는 N (문자열)과 V
(ECMAScript 언어 값 )를 인자로
받아
unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 이름이 N 인 식별자의 현재 바인딩 값을
V 로 설정합니다. 호출 시 다음 단계를 수행합니다:
? envRec .SetMutableBinding (N ,
V , false )을 수행한다.
unused 를 반환한다.
참고
이 명세에서 객체 환경 레코드에 대한 CreateMutableBinding의 모든 사용은 곧바로 같은 이름에 대해
InitializeBinding을 호출합니다. 따라서 이 명세는 객체 환경 레코드 의 바인딩
초기화
상태를 명시적으로 추적하지 않습니다.
9.1.1.2.5 SetMutableBinding ( N ,
V ,
S )
객체 환경 레코드
envRec 의 SetMutableBinding 구체 메서드는 N (문자열), V
(ECMAScript 언어 값 ),
S (불리언)를 인자로 받아 unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 환경
레코드 와 연관된 바인딩 객체의 N 이라는 이름의 프로퍼티 값을 V 로
설정하려고
시도합니다. N 이라는 이름의 프로퍼티가 보통 이미 존재하지만, 존재하지 않거나 쓰기 불가능한 경우 오류 처리는
S 에
따라 결정됩니다. 호출 시 다음 단계를 수행합니다:
bindingObject 를 envRec .[[BindingObject]] 로 둔다.
stillExists 를 ? HasProperty (bindingObject ,
N )로 둔다.
stillExists 가 false 이고 S 가
true 라면 ReferenceError 예외를 발생시킨다.
? Set (bindingObject ,
N , V , S )를 수행한다.
unused 를 반환한다.
9.1.1.2.6 GetBindingValue ( N , S )
객체 환경 레코드
envRec 의 GetBindingValue 구체 메서드는 N (문자열)과 S (불리언)를
인자로
받아 ECMAScript 언어 값을 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 연관된 바인딩 객체의 N 이름의 프로퍼티
값을
반환합니다. 프로퍼티는 이미 존재해야 하지만, 존재하지 않을 경우 결과는 S 에 따라 달라집니다. 호출 시 다음 단계를 수행합니다:
bindingObject 를 envRec .[[BindingObject]] 로 둔다.
value 를 ? HasProperty (bindingObject ,
N )로 둔다.
value 가 false 라면,
S 가 false 라면
undefined 를
반환하고, 아니면 ReferenceError 예외를 발생시킨다.
? Get (bindingObject ,
N )를 반환한다.
9.1.1.2.7 DeleteBinding ( N )
객체 환경 레코드
envRec 의 DeleteBinding 구체 메서드는 N (문자열)을 인자로 받아 불리언을 포함하는 정상
완료
또는 throw
completion 을 반환합니다. 이 메서드는 환경 객체의 [[Configurable]] 특성이 true 인 프로퍼티에 대응되는
바인딩만
삭제할 수 있습니다. 호출 시 다음 단계를 수행합니다:
bindingObject 를 envRec .[[BindingObject]] 로 둔다.
? bindingObject .[[Delete]] (N )를 반환한다.
9.1.1.2.8 HasThisBinding ( )
객체 환경 레코드
envRec 의 HasThisBinding 구체 메서드는 인자가 없으며 false 를 반환합니다.
호출 시
다음 단계를 수행합니다:
false 를 반환한다.
참고
객체 환경 레코드 는
this 바인딩을 제공하지 않습니다.
9.1.1.2.9 HasSuperBinding ( )
객체 환경 레코드
envRec 의 HasSuperBinding 구체 메서드는 인자가 없으며 false 를 반환합니다.
호출 시
다음 단계를 수행합니다:
false 를 반환한다.
참고
객체 환경 레코드 는
super 바인딩을 제공하지 않습니다.
9.1.1.2.10 WithBaseObject ( )
객체 환경 레코드
envRec 의 WithBaseObject 구체 메서드는 인자가 없으며 객체 또는
undefined 를
반환합니다. 호출 시 다음 단계를 수행합니다:
envRec .[[IsWithEnvironment]] 가
true 라면, envRec .[[BindingObject]] 를 반환한다.
그렇지 않으면 undefined 를 반환한다.
9.1.1.3 함수 환경 레코드
함수 환경 레코드 는 선언적 환경 레코드 이며, 함수의 최상위
스코프를 표현하는 데 사용되고, 함수가 ArrowFunction 이 아닐 경우 this
바인딩을
제공합니다. 함수가 ArrowFunction 이
아니고 super를 참조한다면, 해당 함수 환경 레코드는 함수 내부에서 super 메서드 호출을 수행하는 데
사용되는
상태도 포함합니다.
함수 환경 레코드는 표
18 에 나열된 추가 상태 필드를 가집니다.
표 18: 함수 환경
레코드 의 추가 필드
필드 이름
값
의미
[[ThisValue]]
ECMAScript 언어
값
이 함수 호출에 사용되는 this 값입니다.
[[ThisBindingStatus]]
lexical , initialized ,
또는
uninitialized
값이 lexical 라면, 이는 ArrowFunction 이며 로컬
this 값을 가지지 않습니다.
[[FunctionObject]]
ECMAScript 함수 객체
이 환경 레코드 가 생성된
호출을
야기한 함수 객체 입니다.
[[NewTarget]]
생성자 또는
undefined
이 환경 레코드 가 [[Construct]] 내부 메서드에 의해 생성되었다면, [[NewTarget]] 은 [[Construct]] 의 newTarget 파라미터
값입니다.
그렇지 않으면 값은 undefined 입니다.
함수 환경 레코드는 선언적 환경 레코드 의 모든
메서드(표 16 참조)를
지원하며,
HasThisBinding과 HasSuperBinding을 제외한 모든 메서드는 동일한 명세를 따릅니다. 또한, 함수 환경 레코드는 표
19 에 나열된 메서드들도 지원합니다:
표 19: 함수 환경
레코드 의 추가 메서드
메서드
목적
GetThisBinding()
이 환경 레코드 의
this 바인딩 값을 반환합니다. this 바인딩이 초기화되지 않았다면
ReferenceError 를 발생시킵니다.
9.1.1.3.1 BindThisValue ( envRec ,
V )
추상 연산 BindThisValue는 envRec (함수 환경 레코드 )와
V
(ECMAScript 언어 값 )를 인자로
받아,
unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 연산은 envRec .[[ThisValue]] 를 세팅하고, 초기화되었음을 기록합니다. 호출 시 다음 단계를 수행합니다:
Assert :
envRec .[[ThisBindingStatus]] 가
lexical 이 아님을 보장한다.
envRec .[[ThisBindingStatus]] 가
initialized 라면, ReferenceError 예외를
발생시킨다.
envRec .[[ThisValue]] 를 V 로
설정한다.
envRec .[[ThisBindingStatus]] 를
initialized 로 설정한다.
unused 를 반환한다.
9.1.1.3.2 HasThisBinding ( )
함수 환경 레코드
envRec 의 HasThisBinding 구체 메서드는 인자가 없으며 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:
envRec .[[ThisBindingStatus]] 가
lexical 이면 false 를, 아니면
true 를 반환한다.
9.1.1.3.3 HasSuperBinding ( )
함수 환경 레코드
envRec 의 HasSuperBinding 구체 메서드는 인자가 없으며 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:
envRec .[[ThisBindingStatus]] 가
lexical 라면 false 를 반환한다.
envRec .[[FunctionObject]] .[[HomeObject]] 가 undefined 라면
false 를, 아니면 true 를 반환한다.
9.1.1.3.4 GetThisBinding ( )
함수 환경 레코드
envRec 의 GetThisBinding 구체 메서드는 인자가 없으며 ECMAScript 언어 값을 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 호출 시 다음 단계를 수행합니다:
Assert :
envRec .[[ThisBindingStatus]] 가
lexical 이 아님을 보장한다.
envRec .[[ThisBindingStatus]] 가
uninitialized 라면 ReferenceError 예외를
발생시킨다.
envRec .[[ThisValue]] 를 반환한다.
9.1.1.3.5 GetSuperBase ( envRec )
추상 연산 GetSuperBase는 envRec (함수 환경
레코드 )를 인자로 받아 객체, null , 또는
undefined 를 반환합니다. 이 연산은 envRec 에 바인딩된
super
프로퍼티 접근의 기반이 되는 객체를 반환합니다. 값이 undefined 이면, 그러한 접근이 런타임 오류를 발생시킴을
나타냅니다. 호출 시 다음 단계를 수행합니다:
home 을 envRec .[[FunctionObject]] .[[HomeObject]] 로 둔다.
home 이 undefined 라면
undefined 를
반환한다.
Assert :
home 이 ordinary object 임을 보장한다.
! home .[[GetPrototypeOf]] ()의 결과를
반환한다.
9.1.1.4 전역 환경 레코드
전역 환경 레코드 는 공통 realm 에서 처리되는 모든
ECMAScript
Script 요소가 공유하는 가장 바깥쪽 스코프를
나타내는
데 사용됩니다. 전역 환경 레코드는 내장 글로벌(19 ), 글로벌
객체 의 프로퍼티, 그리고 Script 내에서 발생하는 모든 최상위 선언(8.2.9 ,
8.2.11 )에
대한 바인딩을 제공합니다.
전역 환경 레코드는 논리적으로 단일 레코드이지만, 객체 환경 레코드 와
선언적 환경 레코드 를 캡슐화하는
복합체로
명세되어 있습니다. 객체 환경 레코드 의 기반 객체는 관련
Realm
Record 의
글로벌
객체 입니다. 이 글로벌 객체 는 전역 환경 레코드의 GetThisBinding 구체
메서드가
반환하는 값입니다. 전역 환경 레코드의 객체 환경 레코드 구성요소에는 모든 내장
글로벌(19 )과 글로벌 코드에 포함된 FunctionDeclaration , GeneratorDeclaration ,
AsyncFunctionDeclaration ,
AsyncGeneratorDeclaration ,
또는
VariableStatement 로
도입된 바인딩이 포함됩니다. 글로벌 코드의 그 밖의 모든 ECMAScript 선언에 대한 바인딩은 전역 환경 레코드의 선언적 환경 레코드 구성 요소에
포함됩니다.
프로퍼티는 글로벌
객체 에 직접 생성될 수 있습니다. 따라서 전역 환경 레코드의 객체 환경 레코드 구성 요소에는 FunctionDeclaration ,
GeneratorDeclaration ,
AsyncFunctionDeclaration ,
AsyncGeneratorDeclaration ,
VariableDeclaration
선언에 의해 명시적으로 생성된 바인딩과 글로벌 객체 의 프로퍼티로 암묵적으로 생성된 바인딩이 모두 포함될 수
있습니다.
어떤 바인딩이 선언을 통해 명시적으로 생성되었는지 식별하기 위해, 전역 환경 레코드는 CreateGlobalVarBinding 및
CreateGlobalFunctionBinding
추상 연산 에 사용된
이름
목록을 유지합니다.
전역 환경 레코드는 표
20 의 추가 필드와 표
21 의
추가 메서드를 가집니다.
표 20: 전역 환경 레코드 의 추가 필드
표 21: 전역 환경 레코드 의 추가 메서드
메서드
목적
GetThisBinding()
이 환경 레코드 의
this 바인딩 값을 반환합니다.
9.1.1.4.1 HasBinding ( N )
전역 환경 레코드
envRec 의 HasBinding 구체 메서드는 N (문자열)을 인자로 받아 불리언을 포함하는 정상
완료
또는 throw
completion 을 반환합니다. 이 메서드는 인자 식별자가 레코드에 바인딩된 식별자 중 하나인지 판단합니다.
호출
시 다음 단계를 수행합니다:
DclRec 를 envRec .[[DeclarativeRecord]] 로 둔다.
! DclRec .HasBinding(N )이 true 라면
true 를 반환한다.
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
? ObjRec .HasBinding (N )을
반환한다.
9.1.1.4.2 CreateMutableBinding ( N ,
D
)
전역 환경 레코드
envRec 의 CreateMutableBinding 구체 메서드는 N (문자열)과 D
(불리언)를
인자로 받아 unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이름 N 에 대해 초기화되지 않은 새로운 변경 가능한
바인딩을
생성합니다. 바인딩은 관련 DeclarativeRecord에 생성됩니다. DeclarativeRecord에 N 에 대한 바인딩이 이미
존재해서는 안 됩니다. D 가 true 이면, 새로 생성된 바인딩은 삭제 대상임이 표시됩니다. 호출
시 다음
단계를 수행합니다:
DclRec 를 envRec .[[DeclarativeRecord]] 로 둔다.
! DclRec .HasBinding(N )이 true 라면
TypeError 예외를 발생시킨다.
! DclRec .CreateMutableBinding(N , D )을
반환한다.
9.1.1.4.3 CreateImmutableBinding ( N ,
S )
전역 환경 레코드
envRec 의 CreateImmutableBinding 구체 메서드는 N (문자열)과 S
(불리언)를 인자로 받아 unused를 포함하는
정상
완료 또는 throw
completion 을 반환합니다. 이름 N 에 대해 초기화되지 않은 새로운 변경 불가능한
바인딩을
생성합니다. 이 환경 레코드 내에 N 에 대한
바인딩이
이미 존재해서는 안 됩니다. S 가 true 이면, 새로 생성된 바인딩이 strict 바인딩임을
표시합니다.
호출 시 다음 단계를 수행합니다:
DclRec 를 envRec .[[DeclarativeRecord]] 로 둔다.
! DclRec .HasBinding(N )이 true 라면
TypeError 예외를 발생시킨다.
! DclRec .CreateImmutableBinding(N , S )을
반환한다.
9.1.1.4.4 InitializeBinding ( N , V
)
전역 환경 레코드
envRec 의 InitializeBinding 구체 메서드는 N (문자열)과 V
(ECMAScript 언어 값 )를 인자로
받아
unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 이름이 N 인 식별자의 현재 바인딩 값을
V 로 설정합니다. N 에 대한 초기화되지 않은 바인딩이 이미 존재해야 합니다. 호출 시 다음 단계를 수행합니다:
DclRec 를 envRec .[[DeclarativeRecord]] 로 둔다.
! DclRec .HasBinding(N )이
true 라면,
! DclRec .InitializeBinding(N ,
V )을
반환한다.
Assert :
바인딩이 존재한다면, 반드시 객체 환경
레코드 에 존재해야 한다.
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
? ObjRec .InitializeBinding (N ,
V )을 반환한다.
9.1.1.4.5 SetMutableBinding ( N ,
V ,
S )
전역 환경 레코드
envRec 의 SetMutableBinding 구체 메서드는 N (문자열), V
(ECMAScript 언어 값 ),
S (불리언)를 인자로 받아 unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 이름이 N 인 식별자의 현재 바인딩 값을
V 로 변경하려고 시도합니다. 바인딩이 변경 불가능한 경우 S 가 true 이면
TypeError 를 발생시킵니다. N 이라는 이름의 프로퍼티가 보통 이미 존재하지만, 존재하지
않거나 쓰기
불가능한 경우 오류 처리는 S 에 따라 결정됩니다. 호출 시 다음 단계를 수행합니다:
DclRec 를 envRec .[[DeclarativeRecord]] 로 둔다.
! DclRec .HasBinding(N )이
true 라면,
? DclRec .SetMutableBinding(N ,
V ,
S )을 반환한다.
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
? ObjRec .SetMutableBinding (N ,
V , S )을 반환한다.
9.1.1.4.6 GetBindingValue ( N , S )
전역 환경 레코드
envRec 의 GetBindingValue 구체 메서드는 N (문자열)과 S (불리언)를
인자로
받아 ECMAScript 언어 값을 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 이름이 N 인 바인딩된 식별자의 값을
반환합니다.
바인딩이 초기화되지 않은 바인딩이면 ReferenceError 예외를 발생시킵니다. N 이라는
이름의
프로퍼티가 보통 이미 존재하지만, 존재하지 않거나 쓰기 불가능한 경우 결과는 S 에 따라 결정됩니다. 호출 시 다음 단계를
수행합니다:
DclRec 를 envRec .[[DeclarativeRecord]] 로 둔다.
! DclRec .HasBinding(N )이
true 라면,
? DclRec .GetBindingValue(N ,
S )을
반환한다.
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
? ObjRec .GetBindingValue (N ,
S )을 반환한다.
9.1.1.4.7 DeleteBinding ( N )
전역 환경 레코드
envRec 의 DeleteBinding 구체 메서드는 N (문자열)을 인자로 받아 불리언을 포함하는 정상
완료
또는 throw
completion 을 반환합니다. 이 메서드는 삭제 대상임이 명시적으로 지정된 바인딩만 삭제할 수 있습니다.
호출 시
다음 단계를 수행합니다:
DclRec 를 envRec .[[DeclarativeRecord]] 로 둔다.
! DclRec .HasBinding(N )이
true 라면,
! DclRec .DeleteBinding(N )을 반환한다.
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
globalObject 를 ObjRec .[[BindingObject]] 로 둔다.
existingProp 를 ? HasOwnProperty (globalObject ,
N )로 둔다.
existingProp 이 true 라면,
? ObjRec .DeleteBinding (N )을
반환한다.
true 를 반환한다.
9.1.1.4.8 HasThisBinding ( )
전역 환경 레코드
envRec 의 HasThisBinding 구체 메서드는 인자가 없으며 true 를 반환합니다. 호출
시
다음 단계를 수행합니다:
true 를 반환한다.
참고
전역 환경 레코드 는 항상
this 바인딩을 제공합니다.
9.1.1.4.9 HasSuperBinding ( )
전역 환경 레코드
envRec 의 HasSuperBinding 구체 메서드는 인자가 없으며 false 를 반환합니다.
호출 시
다음 단계를 수행합니다:
false 를 반환한다.
참고
전역 환경 레코드 는
super 바인딩을 제공하지 않습니다.
9.1.1.4.10 WithBaseObject ( )
전역 환경 레코드
envRec 의 WithBaseObject 구체 메서드는 인자가 없으며 undefined 를
반환합니다.
호출 시 다음 단계를 수행합니다:
undefined 를 반환한다.
9.1.1.4.11 GetThisBinding ( )
전역 환경 레코드
envRec 의 GetThisBinding 구체 메서드는 인자가 없으며 객체를 포함하는 정상
완료 를
반환합니다. 호출 시 다음 단계를 수행합니다:
envRec .[[GlobalThisValue]] 를 반환한다.
9.1.1.4.12 HasLexicalDeclaration ( envRec ,
N )
추상 연산 HasLexicalDeclaration은 envRec (전역 환경 레코드 )와
N
(문자열)을 인자로 받아 불리언을 반환합니다. 이 연산은 인자 식별자가 LexicalDeclaration 또는 ClassDeclaration 과
같은
렉시컬 선언을 사용해 envRec 에 바인딩되어 있는지 판단합니다. 호출 시 다음 단계를 수행합니다:
DclRec 를 envRec .[[DeclarativeRecord]] 로 둔다.
! DclRec .HasBinding(N )을 반환한다.
9.1.1.4.13 HasRestrictedGlobalProperty (
envRec ,
N )
추상 연산 HasRestrictedGlobalProperty는 envRec (전역 환경 레코드 )와
N
(문자열)을 인자로 받아 불리언을 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 연산은 인자 식별자가 글로벌
객체 의 글로벌 렉시컬 바인딩에 의해 가려져서는 안 되는 프로퍼티 이름인지 판단합니다. 호출 시 다음 단계를
수행합니다:
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
globalObject 를 ObjRec .[[BindingObject]] 로 둔다.
existingProp 를 ? globalObject .[[GetOwnProperty]] (N )로 둔다.
existingProp 이 undefined 라면
false 를 반환한다.
existingProp .[[Configurable]] 가
true 라면 false 를 반환한다.
true 를 반환한다.
참고
글로벌 객체 에 var나 function 선언을
사용하지
않고 직접 생성된 프로퍼티가 존재할 수 있습니다. 글로벌 렉시컬 바인딩은 글로벌 객체 의
non-configurable 프로퍼티와 같은 이름으로는 생성될 수 없습니다. "undefined"
글로벌
프로퍼티가 그 예입니다.
9.1.1.4.14 CanDeclareGlobalVar ( envRec ,
N )
추상 연산 CanDeclareGlobalVar는 envRec (전역 환경 레코드 )와
N
(문자열)을 인자로 받아, 불리언을 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 연산은 동일한 N 인자로 CreateGlobalVarBinding 을
호출할 경우
성공할지 판단합니다. 중복 var 선언 및 기존 글로벌 객체 프로퍼티에 대한 var 선언은 허용됩니다. 호출 시
다음
단계를 수행합니다:
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
globalObject 를 ObjRec .[[BindingObject]] 로 둔다.
hasProperty 를 ? HasOwnProperty (globalObject ,
N )로 둔다.
hasProperty 가 true 라면 true 를
반환한다.
? IsExtensible (globalObject )를
반환한다.
9.1.1.4.15 CanDeclareGlobalFunction ( envRec ,
N )
추상 연산 CanDeclareGlobalFunction은 envRec (전역 환경 레코드 )와
N
(문자열)을 인자로 받아, 불리언을 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 연산은 동일한 N 인자로 CreateGlobalFunctionBinding 을
호출할 경우 성공할지 판단합니다. 호출 시 다음 단계를 수행합니다:
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
globalObject 를 ObjRec .[[BindingObject]] 로 둔다.
existingProp 를 ? globalObject .[[GetOwnProperty]] (N )로 둔다.
existingProp 가 undefined 라면, ? IsExtensible (globalObject )를
반환한다.
existingProp .[[Configurable]] 가
true 라면 true 를 반환한다.
IsDataDescriptor (existingProp )가
true 이고 existingProp 의 특성 값이 { [[Writable]] : true , [[Enumerable]] : true }라면
true 를 반환한다.
false 를 반환한다.
9.1.1.4.16 CreateGlobalVarBinding ( envRec ,
N , D )
추상 연산 CreateGlobalVarBinding은 envRec (전역 환경 레코드 ),
N
(문자열), D (불리언)를 인자로 받아, unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 연관된 객체 환경 레코드 에 변경 가능한 바인딩을
생성
및 초기화합니다. 바인딩이 이미 존재한다면 재사용하며, 이미 초기화된 것으로 간주합니다. 호출 시 다음 단계를 수행합니다:
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
globalObject 를 ObjRec .[[BindingObject]] 로 둔다.
hasProperty 를 ? HasOwnProperty (globalObject ,
N )로 둔다.
extensible 을 ? IsExtensible (globalObject )로
둔다.
hasProperty 가 false 이고 extensible 이
true 라면,
? ObjRec .CreateMutableBinding (N ,
D )을 수행한다.
? ObjRec .InitializeBinding (N ,
undefined )을 수행한다.
unused 를 반환한다.
9.1.1.4.17 CreateGlobalFunctionBinding (
envRec ,
N , V , D )
추상 연산 CreateGlobalFunctionBinding은 envRec (전역 환경 레코드 ),
N
(문자열), V (ECMAScript 언어
값 ),
D (불리언)를 인자로 받아, unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 연관된 객체 환경 레코드 에 변경 가능한 바인딩을
생성
및 초기화합니다. 바인딩이 이미 존재한다면 대체합니다. 호출 시 다음 단계를 수행합니다:
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
globalObject 를 ObjRec .[[BindingObject]] 로 둔다.
existingProp 를 ? globalObject .[[GetOwnProperty]] (N )로 둔다.
existingProp 가 undefined 이거나
existingProp .[[Configurable]] 가
true 라면,
desc 를 PropertyDescriptor { [[Value]] : V , [[Writable]] : true , [[Enumerable]] : true ,
[[Configurable]] : D }로 둔다.
그 외의 경우,
desc 를 PropertyDescriptor { [[Value]] : V }로 둔다.
? DefinePropertyOrThrow (globalObject ,
N , desc )을 수행한다.
? Set (globalObject ,
N , V , false )을 수행한다.
unused 를 반환한다.
참고
전역 함수 선언은 항상 글로벌 객체 의 own 프로퍼티로 표현됩니다.
가능할
경우, 기존 own 프로퍼티를 표준 특성 값 집합을 가지도록 재설정합니다. 7 단계는
InitializeBinding 구체 메서드를 호출하는 것과 동등하며, globalObject 가 Proxy인 경우
동일한
Proxy trap 호출 시퀀스를 생성합니다.
9.1.1.5 모듈 환경 레코드
모듈 환경 레코드 는 선언적 환경 레코드 로,
ECMAScript
Module 의 외부 스코프를 표현하는 데
사용됩니다.
일반적인 변경 가능/불변 바인딩 외에, 모듈 환경 레코드는 다른 환경 레코드 에 존재하는 대상
바인딩에
간접적으로 접근할 수 있는 변경 불가능한 import 바인딩도 제공합니다.
모듈 환경 레코드는 선언적 환경 레코드 의 모든
메서드(표 16 참조)를
지원하며,
GetBindingValue, DeleteBinding, HasThisBinding, GetThisBinding을 제외한 모든 메서드는 동일한 명세를
따릅니다.
또한, 모듈 환경 레코드는 표
22 에 나열된 메서드들도 지원합니다:
표 22: 모듈 환경 레코드 의 추가 메서드
메서드
목적
GetThisBinding()
이 환경 레코드 의
this 바인딩의 값을 반환합니다.
9.1.1.5.1 GetBindingValue ( N , S )
모듈 환경 레코드
envRec 의 GetBindingValue 구체 메서드는 N (문자열), S (불리언)를
인자로
받아 ECMAScript 언어 값을 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 이름이 N 인 바인딩된 식별자의 값을
반환합니다.
단, 바인딩이 간접 바인딩인 경우 대상 바인딩의 값을 반환합니다. 바인딩이 존재하지만 아직 초기화되지 않았다면
ReferenceError 가 발생합니다. 호출 시 다음 단계를 수행합니다:
Assert :
S 가 true 임을 보장한다.
Assert :
envRec 에 N 에 대한 바인딩이 존재함을 보장한다.
N 에 대한 바인딩이 간접 바인딩이라면,
이 바인딩이 생성될 때 제공된 indirection 값 M 및 N2 를 얻는다.
targetEnv 를 M .[[Environment]] 로 둔다.
targetEnv 가 empty 라면
ReferenceError 예외를 발생시킨다.
? targetEnv .GetBindingValue (N2 ,
true )를 반환한다.
envRec 내 N 에 대한 바인딩이 초기화되지 않았다면
ReferenceError 예외를 발생시킨다.
envRec 내 N 에 현재 바인딩된 값을 반환한다.
참고
S 는 항상 true 입니다. 왜냐하면 Module 은 항상 엄격 모드 코드 이기 때문입니다.
9.1.1.5.2 DeleteBinding ( N )
모듈 환경 레코드 의
DeleteBinding
구체 메서드는 이 명세 안에서 사용되지 않습니다.
참고
모듈 환경 레코드 는 엄격
코드
내에서만 사용되며, 조기 오류 규칙에 의해 엄격 코드 내에서 Reference
Record 가 모듈 환경
레코드 바인딩으로 해석되는 경우 delete 연산자를 사용할 수 없습니다. 13.5.1.1
참고.
9.1.1.5.3 HasThisBinding ( )
모듈 환경 레코드
envRec 의 HasThisBinding 구체 메서드는 인자가 없으며 true 를 반환합니다. 호출
시
다음 단계를 수행합니다:
true 를 반환한다.
참고
모듈 환경 레코드 는 항상
this 바인딩을 제공합니다.
9.1.1.5.4 GetThisBinding ( )
모듈 환경 레코드
envRec 의 GetThisBinding 구체 메서드는 인자가 없으며 undefined를 포함하는 정상
완료 를 반환합니다. 호출 시 다음 단계를 수행합니다:
undefined 를 반환한다.
9.1.1.5.5 CreateImportBinding ( envRec ,
N , M , N2 )
추상 연산 CreateImportBinding은 envRec (모듈 환경 레코드 ),
N
(문자열), M (모듈 레코드 ), N2
(문자열)을
인자로 받아 unused 를 반환합니다. N 에 대해 초기화된 변경 불가능한 간접 바인딩을
새롭게
생성합니다. envRec 내에 이미 N 에 대한 바인딩이 존재해서는 안 됩니다. N2 는
M 의 모듈 환경 레코드 에 존재하는 바인딩의
이름입니다. 새 바인딩에 대한 값 접근은 간접적으로 대상 바인딩의 값을 접근합니다. 호출 시 다음 단계를 수행합니다:
Assert :
envRec 에 N 에 대한 바인딩이 이미 존재하지 않음을 보장한다.
Assert :
M .[[Environment]] 가 인스턴스화될 때
N2 에
대한 직접 바인딩을 가지게 됨을 보장한다.
envRec 에 N 에 대해 M 과 N2 를 대상 바인딩으로
참조하는
변경 불가능한 간접 바인딩을 생성하고, 이 바인딩이 초기화되었음을 기록한다.
unused 를 반환한다.
9.1.2 환경 레코드 연산
다음의 추상 연산 들은 이 명세에서
환경
레코드 에 대해 동작할 때 사용됩니다:
9.1.2.1 GetIdentifierReference ( env ,
name , strict )
추상 연산 GetIdentifierReference는 env (환경 레코드 또는
null ), name (문자열), strict (불리언)을 인자로 받아,
Reference Record를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 호출 시 다음 단계를 수행합니다:
env 가 null 이면,
Reference
Record { [[Base]] :
unresolvable , [[ReferencedName]] : name , [[Strict]] : strict , [[ThisValue]] :
empty }를
반환한다.
exists 를 ? env .HasBinding (name )로 둔다.
exists 가 true 이면,
Reference
Record { [[Base]] :
env , [[ReferencedName]] :
name , [[Strict]] : strict ,
[[ThisValue]] :
empty }를
반환한다.
그 외의 경우,
outer 를 env .[[OuterEnv]] 로
둔다.
? GetIdentifierReference (outer ,
name , strict )를 반환한다.
9.1.2.2 NewDeclarativeEnvironment ( E )
추상 연산 NewDeclarativeEnvironment는 E (환경 레코드 또는
null )를 인자로 받아 선언적 환경
레코드 를
반환합니다. 호출 시 다음 단계를 수행합니다:
env 를 새로운 선언적 환경
레코드 (바인딩 없음)로 둔다.
env .[[OuterEnv]] 를 E 로 설정한다.
env 를 반환한다.
9.1.2.3 NewObjectEnvironment ( O , W ,
E )
추상 연산 NewObjectEnvironment는 O (객체), W (불리언), E
(환경
레코드 또는 null )를 인자로 받아 객체 환경 레코드 를 반환합니다. 호출 시 다음
단계를
수행합니다:
env 를 새로운 객체 환경
레코드 로 둔다.
env .[[BindingObject]] 를 O 로 설정한다.
env .[[IsWithEnvironment]] 를 W 로
설정한다.
env .[[OuterEnv]] 를 E 로 설정한다.
env 를 반환한다.
9.1.2.4 NewFunctionEnvironment ( F ,
newTarget )
추상 연산 NewFunctionEnvironment는 F (ECMAScript 함수 객체 ),
newTarget
(객체 또는 undefined )를 인자로 받아 함수 환경 레코드 를 반환합니다. 호출 시
다음
단계를 수행합니다:
env 를 새로운 함수 환경
레코드 (바인딩 없음)로 둔다.
env .[[FunctionObject]] 를 F 로 설정한다.
F .[[ThisMode]] 가
lexical 이면, env .[[ThisBindingStatus]] 를 lexical 로
설정한다.
그 외의 경우, env .[[ThisBindingStatus]] 를
uninitialized 로 설정한다.
env .[[NewTarget]] 를 newTarget 로
설정한다.
env .[[OuterEnv]] 를 F .[[Environment]] 로 설정한다.
env 를 반환한다.
9.1.2.5 NewGlobalEnvironment ( G ,
thisValue )
추상 연산 NewGlobalEnvironment는 G (객체), thisValue (객체)를 인자로 받아
전역 환경 레코드 를 반환합니다. 호출 시 다음
단계를
수행합니다:
objRec 를 NewObjectEnvironment (G ,
false , null )로 둔다.
dclRec 를 NewDeclarativeEnvironment (null )로
둔다.
env 를 새로운 전역 환경
레코드 로 둔다.
env .[[ObjectRecord]] 를 objRec 로
설정한다.
env .[[GlobalThisValue]] 를
thisValue 로 설정한다.
env .[[DeclarativeRecord]] 를
dclRec 로 설정한다.
env .[[OuterEnv]] 를 null 로
설정한다.
env 를 반환한다.
9.1.2.6 NewModuleEnvironment ( E )
추상 연산 NewModuleEnvironment는 E (환경 레코드 )를 인자로 받아
모듈 환경 레코드 를 반환합니다. 호출 시 다음
단계를
수행합니다:
env 를 새로운 모듈 환경
레코드 (바인딩 없음)로 둔다.
env .[[OuterEnv]] 를 E 로 설정한다.
env 를 반환한다.
9.2 PrivateEnvironment 레코드
PrivateEnvironment 레코드 는 ECMAScript 코드 내의 ClassDeclaration 및 ClassExpression 의 렉시컬 중첩 구조를 기반으로 Private
Name 을 추적하기 위해 사용되는 명세 메커니즘입니다. 이들은 환경
레코드 와 유사하지만 구분됩니다. 각
PrivateEnvironment 레코드 는 하나의 ClassDeclaration 또는 ClassExpression 에 연관됩니다. 해당 클래스가
평가될
때마다, 그 클래스에서 선언된 Private Name 을 기록하기 위해 새로운 PrivateEnvironment 레코드 가 생성됩니다.
각 PrivateEnvironment 레코드 는 표 23 에 정의된 필드를 가집니다.
표 23: PrivateEnvironment 레코드 필드
9.2.1 PrivateEnvironment 레코드 연산
다음의 추상 연산 들은 이 명세에서
PrivateEnvironment 레코드 에 대해 동작할 때
사용됩니다:
9.2.1.1 NewPrivateEnvironment ( outerPrivateEnv )
추상 연산 NewPrivateEnvironment는 outerPrivateEnv (PrivateEnvironment 레코드 또는
null )를 인자로 받아 PrivateEnvironment
레코드 를 반환합니다. 호출 시 다음 단계를 수행합니다:
names 를 새로운 빈 List 로 둔다.
PrivateEnvironment 레코드
{
[[OuterPrivateEnvironment]] :
outerPrivateEnv ,
[[Names]] : names }를 반환한다.
9.2.1.2 ResolvePrivateIdentifier ( privateEnv ,
identifier )
추상 연산 ResolvePrivateIdentifier는 privateEnv (PrivateEnvironment 레코드 ),
identifier (문자열)를 인자로 받아 Private Name 를 반환합니다. 호출 시
다음 단계를 수행합니다:
names 를 privateEnv .[[Names]] 로 둔다.
names 의 각 Private Name pn 에 대해,
pn .[[Description]] 이
identifier 라면,
pn 를 반환한다.
outerPrivateEnv 를 privateEnv .[[OuterPrivateEnvironment]] 로 둔다.
Assert :
outerPrivateEnv 는 null 이 아님을 보장한다.
ResolvePrivateIdentifier (outerPrivateEnv ,
identifier )를 반환한다.
9.3 Realm
평가되기 전에, 모든 ECMAScript 코드는 realm 에 연관되어야
합니다.
개념적으로, realm 은 일련의 내장 객체
집합,
ECMAScript 글로벌 환경, 그 글로벌 환경의 범위 내에서 로드된 모든 ECMAScript 코드, 기타 관련 상태와 리소스로 구성됩니다.
realm 은 이 명세에서 Realm Record 로 표현되며, 표
24 에 명시된 필드를 가집니다:
표 24: Realm
Record 필드
9.3.1 InitializeHostDefinedRealm ( )
추상 연산 InitializeHostDefinedRealm는 인자가 없으며, unused를 포함하는 정상 완료
또는
throw completion 을
반환합니다.
호출 시 다음 단계를 수행합니다:
realm 을 새로운 Realm Record 로 둔다.
CreateIntrinsics (realm )을
수행한다.
realm .[[AgentSignifier]] 를 AgentSignifier ()로 설정한다.
realm .[[TemplateMap]] 을 새로운 빈 List 로 설정한다.
newContext 를 새로운 실행 컨텍스트 로 둔다.
newContext 의 Function을 null 로 설정한다.
newContext 의 Realm 을 realm 으로 설정한다.
newContext 의 ScriptOrModule을 null 로 설정한다.
newContext 를 실행 컨텍스트 스택 에 푸시한다;
newContext 가 실행 중인 실행 컨텍스트 가 된다.
호스트 가
realm 의 글로벌 객체 로 익조틱
객체 를 사용해야 한다면,
global 을 그런 객체로, 호스트 정의 방식으로 생성한다.
그 외의 경우,
global 을 OrdinaryObjectCreate (realm .[[Intrinsics]] .[[%Object.prototype% ]])로
둔다.
호스트 가
realm 의 글로벌 스코프의 this 바인딩이 글로벌
객체 이외의 객체를 반환해야 한다면,
thisValue 를 그런 객체로, 호스트 정의 방식으로 생성한다.
그 외의 경우,
thisValue 를 global 로 둔다.
realm .[[GlobalObject]] 를 global 로 설정한다.
realm .[[GlobalEnv]] 를 NewGlobalEnvironment (global ,
thisValue )로 설정한다.
? SetDefaultGlobalBindings (realm )을
수행한다.
호스트
정의 글로벌 객체 프로퍼티들을 global 에
생성한다.
unused 를 반환한다.
9.3.2 CreateIntrinsics ( realmRec )
추상 연산 CreateIntrinsics는 realmRec (Realm Record )를 인자로 받아
unused 를
반환합니다. 호출 시 다음 단계를 수행합니다:
realmRec .[[Intrinsics]] 를 새로운 Record 로 설정한다.
realmRec .[[Intrinsics]] 의 각 필드를 표 6 에 명시된 값들로 설정한다.
필드명은 표의 첫 번째 열에 기재된 이름이다. 각 필드의 값은, 이 명세의 각 객체 명세에 따라 완전히, 재귀적으로 프로퍼티 값이 채워진 새로운 객체
값이다.
모든 객체 프로퍼티 값은 새로 생성된 객체 값이어야 한다. 내장 함수 객체 인 값은 CreateBuiltinFunction (steps ,
length , name , slots , realmRec ,
prototype )을 수행하여 생성한다. steps 는 명세에 정의된 함수 정의, name 은
함수의
"name" 프로퍼티 초기값, length 는 "length"
초기값,
slots 는 함수의 내부 슬롯명(있으면), prototype 은 함수의 [[Prototype]] 내부 슬롯의 명세 값이다. intrinsic 및 그 프로퍼티 생성 순서는 아직
생성되지
않은 객체에 의존하지 않도록 해야 한다.
AddRestrictedFunctionProperties (realmRec .[[Intrinsics]] .[[%Function.prototype% ]],
realmRec )을 수행한다.
unused 를 반환한다.
9.3.3 SetDefaultGlobalBindings ( realmRec )
추상 연산 SetDefaultGlobalBindings는 realmRec (Realm Record )를 인자로 받아 unused를 포함하는 정상 완료
또는
throw completion 을
반환합니다.
호출 시 다음 단계를 수행합니다:
global 을 realmRec .[[GlobalObject]] 로
둔다.
19 절에 명시된 글로벌 객체의 각 프로퍼티에 대해,
name 을 프로퍼티 이름 의 문자열 값으로 둔다.
desc 를 완전히 채워진 데이터 Property
Descriptor 로 둔다. 여기에는 프로퍼티에 대한 명시된 특성이 포함된다. 19.2 ,
19.3 ,
19.4 에
나열된 프로퍼티의 경우 [[Value]] 특성 값은 realmRec 의
해당
intrinsic 객체이다.
? DefinePropertyOrThrow (global ,
name , desc )를 수행한다.
unused 를 반환한다.
9.4 실행 컨텍스트
실행 컨텍스트 는 ECMAScript 구현체가 코드의 런타임 평가를 추적하기
위해
사용하는 명세 장치입니다. 특정 시점에, 실제로 코드를 실행 중인 agent 마다 최대 하나의 실행 컨텍스트만 존재할 수 있습니다. 이를 agent 의 실행 중인 실행
컨텍스트 라 합니다. 이 명세에서 실행 중인 실행
컨텍스트 에 대한 모든 참조는 상위 agent 의 실행 중인
실행
컨텍스트 를 나타냅니다.
실행 컨텍스트
스택 은
실행 컨텍스트들을 추적하는 데 사용됩니다. 실행 중인 실행 컨텍스트 는 항상 이 스택의 맨 위 요소입니다. 현재
실행
중인 실행 컨텍스트 와 연관된 실행 코드에서 아직 연관되지 않은 실행 코드로 제어가 이동할 때마다, 새 실행 컨텍스트가 생성되어
스택에
푸시되고 실행 중인 실행 컨텍스트 가 됩니다.
실행 컨텍스트는 연관된 코드의 실행 진행을 추적하는 데 필요한 구현체 고유의 상태를 포함합니다. 각 실행 컨텍스트는 최소한 표 25 에 나열된 상태 구성
요소를
가집니다.
표 25: 모든 실행 컨텍스트의 상태 구성 요소
Evaluation 은
실행
중인 실행 컨텍스트 에 의해 여러 정의된 지점에서 일시 중단될 수 있습니다. 일단 실행 중인
실행
컨텍스트 가 일시 중단되면, 다른 실행 컨텍스트가 실행 중인 실행 컨텍스트 가 되어 자신의 코드를
평가하기 시작할 수 있습니다. 이후 일시 중단된 실행 컨텍스트가 다시 실행 중인 실행 컨텍스트 가 되어 코드 평가를
중단된 지점부터 재개할 수
있습니다. 실행 컨텍스트들 간의 실행 중인 실행 컨텍스트 상태의 전이는 보통 스택과 같은
후입선출(LIFO)
방식으로 발생합니다. 다만, 일부 ECMAScript 기능은 실행 중인 실행 컨텍스트 의 비-LIFO 전이를 요구합니다.
실행 중인
실행 컨텍스트 의 Realm 구성 요소 값을 현재
Realm
Record 라고도 합니다. 실행 중인 실행 컨텍스트 의 Function 구성 요소는 활성 함수 객체 라고도 합니다.
ECMAScript 코드 실행 컨텍스트 는 표
26 에 나열된 추가 상태 구성 요소를 가집니다.
표 26: ECMAScript 코드 실행 컨텍스트의 추가 상태 구성 요소
실행 컨텍스트의 LexicalEnvironment, VariableEnvironment 구성 요소는 항상 환경
레코드 입니다.
Generator의 평가를 나타내는 실행 컨텍스트는 표
27 에 나열된 추가 상태 구성 요소를 가집니다.
표 27: Generator 실행 컨텍스트의 추가 상태 구성 요소
구성 요소
목적
Generator
이 실행 컨텍스트 가 평가하는
Generator.
대부분의 상황에서 이 명세 내 알고리즘이 직접 다루는 것은 실행 중인 실행 컨텍스트 (즉, 실행 컨텍스트
스택 의 맨 위)입니다. 따라서 “LexicalEnvironment”, “VariableEnvironment”라는 용어가 한정 없이
사용될
때는 실행 중인 실행 컨텍스트 의 해당 구성 요소를 의미합니다.
실행 컨텍스트는 순수 명세 메커니즘으로, ECMAScript 구현의 실제 산출물과 반드시 대응하지 않습니다. ECMAScript 코드가 실행 컨텍스트를 직접 접근하거나
관찰하는 것은
불가능합니다.
9.4.1 GetActiveScriptOrModule ( )
추상 연산 GetActiveScriptOrModule은 인자가 없으며, Script Record , Module Record 또는
null 을 반환합니다. 실행 중인 실행 컨텍스트 를 기반으로
현재 실행 중인 스크립트 또는
모듈을 결정하는 데 사용됩니다. 호출 시 다음 단계를 수행합니다:
실행 컨텍스트 스택 이 비어있으면
null 을 반환한다.
ec 를 실행 컨텍스트 스택 에서 ScriptOrModule
구성
요소가 null 이 아닌 맨 위의 실행 컨텍스트 로 둔다.
그런 실행 컨텍스트 가 존재하지 않으면
null 을 반환하고, 그렇지 않으면 ec 의 ScriptOrModule을 반환한다.
9.4.2 ResolveBinding ( name [ , env ] )
추상 연산 ResolveBinding은 name (문자열) 및 선택적 env (환경
레코드 또는 undefined )를 인자로 받아, Reference Record를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 연산은 name 의 바인딩을 결정하는 데 사용됩니다.
env 를 명시적으로 지정하면 해당 환경 레코드 에서 바인딩을 탐색합니다. 호출 시 다음 단계를
수행합니다:
env 가 생략되었거나 env 가 undefined 라면,
env 를 실행 중인 실행
컨텍스트 의
LexicalEnvironment로 설정한다.
Assert :
env 는 환경 레코드 임을 보장한다.
strict 를 IsStrict (현재 평가 중인 구문 생성 규칙)로 둔다.
? GetIdentifierReference (env ,
name , strict )를 반환한다.
참고
ResolveBinding의 결과는 항상 [[ReferencedName]] 필드가
name 인
Reference
Record 입니다.
9.4.3 GetThisEnvironment ( )
추상 연산 GetThisEnvironment는 인자가 없으며 환경 레코드 를 반환합니다. 현재 키워드 this의 바인딩을
제공하는
환경
레코드 를 찾습니다. 호출 시 다음 단계를 수행합니다:
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 둔다.
반복,
exists 를 env .HasThisBinding()으로 둔다.
exists 가 true 라면 env 를 반환한다.
outer 를 env .[[OuterEnv]] 로 둔다.
Assert :
outer 가 null 이 아님을 보장한다.
env 를 outer 로 설정한다.
참고
2 단계의 루프는 환경 리스트가 항상
this 바인딩을 가진 글로벌 환경에서 끝나므로 반드시 종료됩니다.
9.4.4 ResolveThisBinding ( )
추상 연산 ResolveThisBinding은 인자가 없으며 ECMAScript 언어 값을 포함하는
정상
완료 또는 throw
completion 을 반환합니다. 실행 중인 실행 컨텍스트 의
LexicalEnvironment를 사용하여 키워드 this의 바인딩을
결정합니다. 호출 시 다음 단계를 수행합니다:
envRec 를 GetThisEnvironment ()로 둔다.
? envRec .GetThisBinding()을 반환한다.
9.4.5 GetNewTarget ( )
추상 연산 GetNewTarget은 인자가 없으며 객체 또는 undefined 를 반환합니다. 실행
중인
실행 컨텍스트 의 LexicalEnvironment를 사용해 NewTarget 값을 결정합니다. 호출 시 다음 단계를
수행합니다:
envRec 를 GetThisEnvironment ()로 둔다.
Assert :
envRec 가 [[NewTarget]] 필드를 가지고 있음을 보장한다.
envRec .[[NewTarget]] 을 반환한다.
9.4.6 GetGlobalObject ( )
추상 연산 GetGlobalObject는 인자가 없으며 객체를 반환합니다. 현재 실행 중인 실행 컨텍스트 가 사용하는
글로벌
객체 를 반환합니다. 호출 시 다음 단계를 수행합니다:
currentRealm 을 현재 Realm Record 로 둔다.
currentRealm .[[GlobalObject]] 를 반환한다.
9.5 잡과 잡을 큐에 넣는 호스트 연산
잡(Job) 은 파라미터가 없는 추상 클로저(Abstract
Closure) 로, 다른 ECMAScript 계산이 현재 진행 중이 아닐 때 ECMAScript 계산을 시작합니다.
잡 은 ECMAScript 호스트 환경 에
의해 특정
에이전트 에서 실행이 예약됩니다. 이 명세는 잡
예약을
위한 호스트 훅 인
HostEnqueueGenericJob , HostEnqueueFinalizationRegistryCleanupJob ,
HostEnqueuePromiseJob , HostEnqueueTimeoutJob 을 설명합니다. 이 명세의
호스트 훅 은 잡 예약에 추가
제약을
가하는 방식에 따라 구성되어 있습니다. 호스트 는
잡을
예약하는 추가 추상 연산 을 정의할 수 있습니다.
이러한
연산은 잡 추상
클로저 와 realm (Realm Record 또는 null )를 인자로 받습니다.
Realm
Record 가
제공되면, 이 연산들은 해당 realm 을
소유하는
에이전트 에서 미래의 어느 시점에 잡 실행을
예약합니다. realm 대신
null 이 제공되면, 잡은 ECMAScript 코드를 실행하지 않습니다. 구현은 다음 요구사항을 따라야 합니다:
참고 1
호스트
환경 은
잡 의
스케줄링을 동일하게 처리할 필요는 없습니다. 예를 들어, 웹 브라우저와 Node.js는 Promise 처리 잡을 다른 작업보다 더 높은 우선순위로 취급합니다.
앞으로의
기능에서는 그렇게 높은 우선순위로 처리되지 않는 잡이 추가될 수도 있습니다.
특정 시점에 scriptOrModule (Script Record , Module
Record 또는 null )이 다음 조건을 모두 만족하면 활성 스크립트 또는 모듈(active script or module) 입니다:
특정 시점에 실행이 다음 조건을 모두 만족하면 ECMAScript 코드 평가 준비
상태(prepared to evaluate ECMAScript code) 입니다:
참고 2
호스트
환경 은 실행 컨텍스트 스택 에 실행
컨텍스트 를 푸시함으로써 코드 평가 준비 상태로 만들 수 있습니다. 구체적인 단계는 구현
정의 입니다.
Realm 의 구체적인 선택은
호스트
환경 에 달려 있습니다. 이 초기 실행 컨텍스트 와 Realm 는 콜백 함수가 호출되기 전까지만
사용됩니다. Promise 핸들러 같은 잡
관련 콜백 함수가 호출되면, 해당 호출은 자체적으로 실행 컨텍스트 와 Realm 를 푸시합니다.
특정 종류의 잡 은 추가 준수 요구사항을 가집니다.
9.5.1 JobCallback 레코드
JobCallback 레코드 는 Record 값으로, 함수 객체 와
호스트 정의
값을
저장하는 데 사용됩니다. 잡 을 통해
호스트 가 큐에 넣는 함수 객체는 추가
호스트 정의
컨텍스트를 가질 수
있습니다. 그 상태를 전파하려면, 잡
추상
클로저 는 함수 객체를 직접 캡처하고 호출하지 말고, HostMakeJobCallback 및
HostCallJobCallback 을 사용해야 합니다.
참고
예를 들어 WHATWG HTML 명세(https://html.spec.whatwg.org/ )는 Promise
콜백의
incumbent settings object를 전파하기 위해 호스트 정의 값을 사용합니다.
JobCallback 레코드는 표 28 에 나열된 필드를 가집니다.
표 28: JobCallback 레코드 필드
필드 명
값
의미
[[Callback]]
함수 객체
잡 이
호출될 때
실행할 함수입니다.
[[HostDefined]]
임의의 값 (기본값 empty )
호스트 가
사용하는 필드입니다.
9.5.2 HostMakeJobCallback ( callback )
호스트 정의
추상 연산
HostMakeJobCallback은 callback (함수 객체 )를 인자로 받아 JobCallback 레코드 를 반환합니다.
HostMakeJobCallback의 구현은 다음을 준수해야 합니다:
HostMakeJobCallback의 기본 구현은 호출 시 다음 단계를 수행합니다:
JobCallback 레코드 { [[Callback]] : callback , [[HostDefined]] : empty }를 반환한다.
웹 브라우저가 아닌 ECMAScript 호스트 는
HostMakeJobCallback의 기본 구현을 사용해야 합니다.
참고
이 연산은 콜백이 결국 예약·실행 책임이 있는 함수에 전달될 때 호출됩니다. 예를 들어
promise.then(thenAction)은
Promise.prototype.then을 호출할 때 thenAction에 대해
MakeJobCallback을
호출하며, 리액션 잡 을
스케줄링할 때가
아닙니다.
9.5.3 HostCallJobCallback ( jobCallback ,
V ,
argumentsList )
호스트 정의
추상 연산
HostCallJobCallback은 jobCallback (JobCallback 레코드 ),
V (ECMAScript 언어 값 ),
argumentsList (List of
ECMAScript 언어 값 )을 인자로 받아,
ECMAScript 언어 값을 포함하는 정상
완료 또는 throw
completion 을 반환합니다.
HostCallJobCallback의 구현은 다음을 준수해야 합니다:
Call (jobCallback .[[Callback]] , V , argumentsList )를 수행하고 그
결과를
반환해야 합니다.
참고
이 요구사항은 호스트 가 이
명세에서
정의한 함수
객체 의 [[Call]] 동작을 변경할 수 없음을 의미합니다.
HostCallJobCallback의 기본 구현은 호출 시 다음 단계를 수행합니다:
Assert :
IsCallable (jobCallback .[[Callback]] )가 true 임을 보장한다.
? Call (jobCallback .[[Callback]] , V , argumentsList )를 반환한다.
웹 브라우저가 아닌 ECMAScript 호스트 는
HostCallJobCallback의 기본 구현을 사용해야 합니다.
9.5.4 HostEnqueueGenericJob ( job , realm )
호스트 정의
추상 연산
HostEnqueueGenericJob은 job (잡 추상 클로저 ),
realm (Realm
Record )를
인자로 받아 unused 를 반환합니다. job 을 realm 이 소유한 에이전트 의 realm 에 예약합니다. 이 알고리즘에서 사용하는
추상
클로저 는 우선순위나 순서 등 추가 제약 없이 예약되는 것을 의도합니다.
HostEnqueueGenericJob의 구현은 9.5 의 요구사항을 따라야 합니다.
9.5.5 HostEnqueuePromiseJob ( job , realm )
호스트 정의
추상 연산
HostEnqueuePromiseJob은 job (잡 추상 클로저 ),
realm (Realm
Record 또는
null )를 인자로 받아 unused 를 반환합니다. job 을 미래의
어느
시점에 실행하도록 예약합니다. 이 알고리즘의 추상 클로저 는 Promise 처리와 관련되거나 Promise 처리 연산과
같은
우선순위로 예약되는 것을 의도합니다.
HostEnqueuePromiseJob의 구현은 9.5 의 요구사항과 다음을 따라야 합니다:
참고
NewPromiseResolveThenableJob 이
반환하는 잡 의
realm 은 보통 then 함수 객체 에 GetFunctionRealm 을 호출한
결과입니다. NewPromiseReactionJob 이 반환하는
잡 의
realm 은
핸들러가 undefined 가 아니면 핸들러에 GetFunctionRealm 을
호출한
결과, 핸들러가 undefined 면 realm 은 null 입니다.
둘 다
GetFunctionRealm 이 비정상적으로 종료(예:
리보크된
Proxy에 호출)되면 realm 은 호출 시점의 현재 Realm Record 입니다.
realm 이
null 이면 사용자 ECMAScript 코드를 평가하지 않으며, 새로운 ECMAScript 객체(예: Error
객체)도
생성되지 않습니다. WHATWG HTML 명세(https://html.spec.whatwg.org/ )는 예를 들어
realm 을 스크립트 실행 가능 여부 점검, entry 개념 등에 사용합니다.
9.5.6 HostEnqueueTimeoutJob ( timeoutJob ,
realm , milliseconds )
호스트 정의
추상 연산
HostEnqueueTimeoutJob은 timeoutJob (잡 추상 클로저 ),
realm (Realm
Record ),
milliseconds (음이 아닌 유한 숫자)를 인자로 받아 unused 를 반환합니다.
timeoutJob 을 realm 이 소유한 에이전트 의 realm 에서 최소 milliseconds 밀리초 후에 실행되도록 예약합니다.
HostEnqueueTimeoutJob의 구현은 9.5 의 요구사항을 따라야 합니다.
9.6 에이전트
에이전트 는 ECMAScript 실행
컨텍스트 집합, 실행 컨텍스트 스택 , 실행 중인
실행
컨텍스트 , 에이전트
레코드 , 실행
스레드 로
구성됩니다. 실행
스레드 를 제외한 모든 구성 요소는 해당 에이전트 에만 독점적으로 속합니다.
에이전트 의 실행 스레드 는
다른
에이전트 와 독립적으로 해당 에이전트 의 실행
컨텍스트 에서 알고리즘 단계를 실행합니다. 단, 실행 스레드 가 여러 에이전트 에 의해 공유될 수는 있지만, 해당 스레드를 공유하는 에이전트 중 어느 것도 [[CanBlock]] 필드가 true 인 에이전트 레코드 를 가져서는 안 됩니다.
참고 1
예를 들어, 일부 웹 브라우저는 하나의 실행 스레드 를 브라우저 창의 여러 무관한 탭에서 공유하기도 합니다.
에이전트 의 실행 스레드 가
알고리즘
단계를 실행하는 동안 그 에이전트 는 해당
단계들의
상위 에이전트 입니다. 이 단계들은
상위
에이전트 를 사용해 에이전트 가 보유한 명세 수준의 실행 객체들, 즉 실행 중인
실행
컨텍스트 , 실행 컨텍스트 스택 , 에이전트 레코드 의 필드에
접근합니다.
에이전트 식별자(agent signifier) 는 에이전트 를 식별하기 위해 사용되는 전역적으로 유일한
불투명
값입니다.
표 29: 에이전트
레코드 필드
필드명
값
의미
[[LittleEndian]]
불리언
GetValueFromBuffer 및
SetValueInBuffer 알고리즘에서
isLittleEndian 파라미터가 필요할 때 계산되는 기본값입니다. 선택은 구현 정의 이며, 구현에 가장 효율적인
대안을
선택해야 합니다. 일단 값이 관찰되면 변경될 수 없습니다.
[[CanBlock]]
불리언
에이전트 가
블록할
수 있는지 여부를 결정합니다.
[[Signifier]]
에이전트
식별자
자신이 속한 에이전트 클러스터 내에서 에이전트 를 유일하게
식별합니다.
[[IsLockFree1]]
불리언
1-바이트 값 에 대한 원자적 연산이 lock-free라면
true , 아니면 false 입니다.
[[IsLockFree2]]
불리언
2-바이트 값 에 대한 원자적 연산이 lock-free라면
true , 아니면 false 입니다.
[[IsLockFree8]]
불리언
8-바이트 값 에 대한 원자적 연산이 lock-free라면
true , 아니면 false 입니다.
[[CandidateExecution]]
candidate execution
레코드
메모리 모델 참고.
[[KeptAlive]]
List
(객체
또는 심볼)
초기값은 새로운 빈 List 로,
현재
잡 이 끝날 때까지
생존해야 하는 객체/심볼 목록을 나타냅니다.
[[ModuleAsyncEvaluationCount]]
정수
초기값은 0이며, 비동기 또는 비동기 의존성이 있는 모듈의 [[AsyncEvaluationOrder]] 필드에 고유하게 증가하는 값을 할당하는 데
사용됩니다.
[[Signifier]] , [[IsLockFree1]] , [[IsLockFree2]] 의 값은 에이전트 클러스터 내의 어떤 에이전트 에라도 관찰되면 변경될 수 없습니다.
참고 2
[[IsLockFree1]] 과 [[IsLockFree2]] 의 값은
반드시
하드웨어에 의해 결정되는 것은 아니며, 구현 선택에 따라 시간 및 ECMAScript 구현별로 달라질 수 있습니다.
[[IsLockFree4]] 필드는 없습니다. 4바이트 원자 연산은 항상 lock-free입니다.
실제로, 원자 연산이 어떤 종류의 락을 사용한다면 lock-free가 아닙니다. lock-free는 wait-free와는 다릅니다. lock-free 원자
연산을
완료하는 데 필요한 머신 스텝 수에 상한이 없습니다.
크기 n 의 원자 접근이 lock-free여도, 크기 n 의 비원자 접근의 (관측된) 원자성에 대해서는 아무것도 보장하지 않습니다.
비원자
접근은 여전히 여러 번의 별도 메모리 접근으로 수행될 수 있습니다. 자세한 내용은 ReadSharedMemory 및
WriteSharedMemory 를 참고하세요.
참고 3
에이전트 는 명세 메커니즘일
뿐이며, 실제
ECMAScript 구현의 어떤 구체적 산출물과 반드시 대응하지는 않습니다.
9.6.1 AgentSignifier ( )
추상 연산 AgentSignifier는 인자가 없으며 에이전트 식별자 를 반환합니다. 호출 시 다음 단계를 수행합니다:
AR 을 상위 에이전트 의 에이전트
레코드 로 둔다.
AR .[[Signifier]] 를 반환한다.
9.6.2 AgentCanSuspend ( )
추상 연산 AgentCanSuspend는 인자가 없으며 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:
AR 을 상위 에이전트 의 에이전트
레코드 로 둔다.
AR .[[CanBlock]] 을 반환한다.
참고
일부 환경에서는 특정 에이전트 가
일시 정지(suspend)하는 것이 비합리적일 수 있습니다. 예를 들어, 웹 브라우저 환경에서는 문서의 메인 이벤트 처리 스레드는 일시 정지를 허용하지
않으면서 워커의 이벤트 처리 스레드는 허용할 수 있습니다.
9.6.3 IncrementModuleAsyncEvaluationCount ( )
추상 연산 IncrementModuleAsyncEvaluationCount는 인자가 없으며 정수 를 반환합니다. 호출 시 다음 단계를 수행합니다:
AR 을 상위 에이전트 의 에이전트
레코드 로 둔다.
count 를 AR .[[ModuleAsyncEvaluationCount]] 로
둔다.
AR .[[ModuleAsyncEvaluationCount]] 를
count
+ 1로 설정한다.
count 를 반환한다.
참고
이 값은 보류 중인 모듈들 간의 상대적인 평가 순서를 추적하는 데만 사용됩니다. 구현은 보류 중인 모듈이 없을 때 [[ModuleAsyncEvaluationCount]] 를 0으로 눈에 띄지 않게 초기화할 수 있습니다.
9.7 에이전트 클러스터
에이전트 클러스터 는 공유 메모리에서 동작하여 통신할 수 있는 에이전트 의 최대 집합입니다.
참고 1
서로 다른 에이전트 내의
프로그램들은
명세되지 않은 방법으로 메모리를 공유할 수 있습니다. 최소한, SharedArrayBuffer의 백업 메모리는 클러스터 내의 에이전트 들 간에 공유될 수 있습니다.
메시지 전달로는 통신할 수 있지만 메모리는 공유할 수 없는 에이전트 가 있을 수 있습니다. 이들은 결코 같은 에이전트 클러스터에 속하지 않습니다.
모든 에이전트 는 정확히 하나의 에이전트
클러스터에
속합니다.
참고 2
클러스터 내의 에이전트 가 항상
동시에
살아 있을 필요는 없습니다. 에이전트
A 가 또 다른 에이전트
B 를 생성한 뒤 A 가 종료되고, B 가 에이전트 C 를 생성했다고 합시다. 만약 A 가 B 와
메모리를
공유할 수 있고, B 가 C 와 메모리를 공유할 수 있다면, 세 에이전트 는 같은 클러스터에 속합니다.
클러스터 내의 모든 에이전트 는 각각의
에이전트 레코드 의
[[LittleEndian]] 필드 값이 동일해야 합니다.
참고 3
에이전트 클러스터 내의 서로 다른 에이전트 가 [[LittleEndian]] 값이
다르면,
멀티바이트 데이터의 공유 메모리 사용이 어려워집니다.
클러스터 내의 모든 에이전트 는 각각의
에이전트 레코드 의
[[IsLockFree1]] 필드 값이 동일해야 하며, [[IsLockFree2]]
필드도
마찬가지입니다.
클러스터 내의 모든 에이전트 는 각각의
에이전트 레코드 의
[[Signifier]] 값이 달라야 합니다.
임베딩(embedding)은 에이전트 의 지식이나
협조
없이 에이전트 의 진행을 중단(비활성화)하거나
재개(활성화)할 수 있습니다. 이럴 경우, 임베딩은 클러스터 내 일부 에이전트 만 활성 상태로 두고 나머지 에이전트 를 무기한 비활성화된 상태로 남겨두어서는 안 됩니다.
참고 4
이 제한의 목적은 다른 에이전트 가
비활성화되어 있는 동안 어떤 에이전트 가
교착 상태에 빠지거나 기아 상태에 빠지는 상황을 방지하기 위함입니다. 예를 들어, 문서와 독립적인 수명을 가진 HTML shared worker가, 그런 독립
문서의
dedicated worker와 메모리를 공유할 수 있도록 허용한다면, 그리고 문서와 그 dedicated worker가 dedicated worker가 락을
보유한
상태에서 비활성화된다면(예: 문서가 윈도우의 history에 푸시됨), shared worker가 그 락을 얻으려 하면 dedicated worker가 다시
활성화될
때까지(혹은 영원히) 대기하게 됩니다. 그 동안 다른 윈도우의 워커들이 shared worker에 접근하려 하면 기아 상태가 됩니다.
이 제한의 의미는 임베딩 내 같은 suspend/wake 집합에 속하지 않은 에이전트 끼리는 메모리 공유가 불가능하다는 점입니다.
임베딩은 클러스터 내 다른 에이전트 의 사전
지식이나
협조 없이 에이전트 를 종료시킬 수 있습니다.
만약
에이전트 가 자기 자신이나 클러스터 내 다른
에이전트 의 프로그래밍적 동작이 아니라 클러스터
외부의
힘에 의해 종료된다면, 임베딩은 두 가지 전략 중 하나를 선택해야 합니다: 클러스터 내 모든 에이전트 를 종료시키거나, 클러스터 내 남은 구성원이 종료 사실을 감지할 수 있도록 신뢰할 수 있는 API를
제공하고, 종료 데이터에는 종료된 에이전트 를
식별할
수 있는 충분한 정보를 포함해야 합니다.
참고 5
이런 종료의 예시로는: 별도 프로세스에서 실행되는 에이전트 를 운영 체제나 사용자가 종료시키는 경우, 임베딩 자체가 같은 프로세스 내에서
실행되는
에이전트 를 종료시키는
경우(에이전트별
자원 관리로 에이전트 가
runaway임이 감지됨) 등이 있습니다.
아래 명세 값과 그로부터 추이적으로 도달 가능한 값들은 정확히 하나의 에이전트 클러스터에 속합니다.
클러스터 내 어떤 에이전트 에 의한
ECMAScript
코드 평가 이전에, 클러스터 내 모든 에이전트
레코드 의 [[CandidateExecution]] 필드는 초기 candidate
execution 으로 설정됩니다. 초기 candidate execution 은
빈
candidate
execution 으로, [[EventsRecords]] 필드는, 각 에이전트 에 대해, [[AgentSignifier]] 필드가 해당 에이전트 의 에이전트 식별자 이고, [[EventList]] 및
[[AgentSynchronizesWith]] 필드가 빈 List 인 Agent
Events
Record 를 포함하는 List 입니다.
참고 6
에이전트 클러스터 내 모든 에이전트 는
에이전트
레코드 의 [[CandidateExecution]] 필드에 있는 같은
candidate execution 을 공유합니다.
candidate execution 은 메모리
모델 에서 사용하는 명세 메커니즘입니다.
참고 7
에이전트 클러스터는 명세 메커니즘일 뿐이며, ECMAScript 구현의 어떤 실제 산출물과 반드시 대응하지는 않습니다.
9.8 전진 진행(Forward Progress)
에이전트 가 전진
진행 (forward
progress)한다는 것은 이 명세에 따라 평가 단계를 수행하는 것입니다.
에이전트 는 실행 중인
실행
컨텍스트 가 동기적으로, 그리고 무기한 외부 이벤트를 기다릴 때 블록(blocked) 상태가 됩니다. 이 의미에서
블록될 수
있는 것은 에이전트 의 에이전트 레코드 의 [[CanBlock]] 필드가 true 인 경우뿐입니다.
비차단(unblocked)
에이전트 는 블록되지 않은 에이전트입니다.
구현체는 다음을 보장해야 합니다:
참고
이와 메모리
모델 의 라이브니스 보장은 모든 seq-cst 쓰기가 결국 모든
에이전트 에서 관찰 가능해짐을
보장합니다.
9.9 WeakRef 및 FinalizationRegistry 대상의 처리 모델
9.9.1 목표
이 명세는 어떤 객체나 심볼도 가비지 컬렉션된다는 보장을 하지 않습니다. 라이브(live) 하지 않은 객체나 심볼은 오랜 시간이 지난 뒤에 해제될 수도 있고,
전혀
해제되지 않을 수도 있습니다. 이 때문에, 이 명세는 가비지 컬렉션에 의해 트리거되는 동작을 설명할 때 "may"라는 용어를 사용합니다.
WeakRef 및 FinalizationRegistry 의
의미론은
특정 시점에 발생하는 두 연산에 기반합니다:
이들 동작(ClearKeptObjects 또는 CleanupFinalizationRegistry )은
동기 ECMAScript 실행을 중단할 수 없습니다. 호스트 가 더 긴 동기 ECMAScript 실행을 조립할 수도 있으므로, 이 명세는 ClearKeptObjects 와 CleanupFinalizationRegistry
예약을
호스트
환경 에 위임합니다.
일부 ECMAScript 구현은 백그라운드에서, 또는 ECMAScript가 유휴 상태일 때 동작하는 가비지 컬렉터를 포함합니다. 호스트
환경 이
CleanupFinalizationRegistry 의
스케줄을 제어하도록 하면, finalizer 작업을 실행하기 위해 ECMAScript 실행을 재개할 수 있으므로, 보유 중인 값을 해제하고 전체 메모리 사용량을 줄일
수
있습니다.
9.9.2 라이브니스(Liveness)
어떤 객체/심볼 집합 S 에 대해 S 에 대한 가상 WeakRef-무시(hypothetical
WeakRef-oblivious) 실행이란, S 의 원소를 참조 대상으로 하는 WeakRefDeref 의 결과가 항상
undefined 를 반환하는 실행입니다.
참고 1
WeakRef-oblivious와 liveness는 두 가지 개념을 포착합니다. 첫째,
WeakRef 자체는 참조 대상을 살아
있게 만들지 않습니다. 둘째, 라이브니스의 순환(cycles)은 값이 live임을 의미하지 않습니다. 예를 들어,
v 의 라이브니스 판정이
WeakRef 참조 대상
r 의
라이브니스
판정에 의존할 때,
r 의 라이브니스는
v 의 라이브니스를 전제할 수 없습니다(순환 논증 불가).
참고 2
WeakRef-obliviousness는 순환을 고려하기 위해 개별 값이 아닌 객체/심볼의 집합에 대해 정의됩니다. 만약 개별 값에 대해 정의한다면, 순환
내의
WeakRef 참조 대상은 그 정체성이 오직 순환 내 다른
WeakRef 참조 대상을 통해서만 관찰될지라도 live로 간주될 것입니다.
참고 3
구어적으로, 어떤 객체나 심볼이 포함된 모든 집합이 live라면, 그 객체나 심볼이 live라고 말합니다.
실행 중 아무 시점에서, 객체/심볼 집합 S 가 다음 조건 중 하나를 만족하면 live 라고 간주합니다:
S 의 어떤 원소라도 어떤 에이전트 의 [[KeptAlive]]
List 에 포함되어 있다.
S 내의 어떤 값의 정체성이 관찰되는, S 에 대해 유효한 미래 가상 WeakRef-oblivious 실행이 존재한다.
참고 4
두 번째 조건은, 어떤 값의 정체성이 non-
WeakRef 수단으로 관찰될 수 있다면 live임을
포착하려는
의도입니다. 값의 정체성은 엄격 동등성 비교나, Map의 키로 사용되는 것을 관찰함으로써 관찰될 수 있습니다.
참고 5
객체나 심볼이 필드, 내부 슬롯, 프로퍼티에 존재한다는 사실만으로 해당 값이 live임을 의미하지 않습니다. 예를 들어, 해당 값이 프로그램에 다시
전달되지
않는다면 관찰될 수 없습니다.
이것은 WeakMap의 키, WeakSet의 멤버, 그리고 FinalizationRegistry
Cell 레코드의 [[WeakRefTarget]] , [[UnregisterToken]] 필드에 해당합니다.
위 정의는, WeakMap 내의 키가 live가 아니라면, 해당 값 또한 반드시 live일 필요가 없음을 의미합니다.
참고 6
라이브니스는
WeakRef 엔진이 비워서는 안 되는 최소 보장입니다.
여기
정의된 라이브니스는 판정 불능(undecidable)입니다. 실제로 엔진은 도달성(reachability) 등 보수적 근사치를 사용합니다. 구현의 재량이
큽니다.
9.9.3 실행
아무 시점에서, 객체/심볼 집합 S 가 live 가 아니라면, ECMAScript 구현은 다음 단계를 원자적으로 수행할 수
있습니다:
S 의 각 원소 value 에 대해,
ref .[[WeakRefTarget]] 가 value 인
모든
WeakRef
ref 에
대해,
ref .[[WeakRefTarget]] 를
empty 로 설정한다.
fg .[[Cells]] 에 cell 이 있고
cell .[[WeakRefTarget]] 가
value 인 모든
FinalizationRegistry
fg 및 레코드
cell 에 대해,
cell .[[WeakRefTarget]] 를
empty 로 설정한다.
선택적으로, HostEnqueueFinalizationRegistryCleanupJob (fg )을
수행한다.
map .[[WeakMapData]] 에 r 이 있고
r .[[Key]] 가 value 인 모든 WeakMap
map 및 레코드
r 에 대해,
r .[[Key]] 를
empty 로 설정한다.
r .[[Value]] 를
empty 로 설정한다.
set .[[WeakSetData]] 에 value 가
포함된
모든 WeakSet set 에 대해,
set .[[WeakSetData]] 의 값이
value 인 요소를 empty 값으로 교체한다.
참고 1
라이브니스 정의와 함께, 이 절은 구현체가 WeakRef 에 대해 적용할 수 있는 최적화를
명시합니다.
객체의 정체성을 관찰하지 않고 객체에 접근하는 것이 가능합니다. 도달하지 않는 객체의 프로퍼티에 대한 데드 변수 제거, 스칼라 치환 등 최적화가
허용됩니다. 이
경우 해당 객체를 가리키는 WeakRef 가 관찰 가능하게 비워지는 것도
허용됩니다.
반면, 객체의 정체성이 관찰 가능하고, 해당 객체가 WeakRef 의 [[WeakRefTarget]] 내부 슬롯에 있을 때, rematerialization 등 WeakRef 를 관찰 가능하게 비우는 최적화는
금지됩니다.
HostEnqueueFinalizationRegistryCleanupJob
호출은 선택적이므로, FinalizationRegistry 에
등록된 객체가 반드시 FinalizationRegistry 를
live 로 유지하는 것은 아닙니다. 구현체는 어떤 이유로든
FinalizationRegistry
콜백을 생략할 수 있습니다(예: FinalizationRegistry
자체가 dead가 되거나, 앱이 종료 중인 경우 등).
참고 2
구현체는 non-live 객체/심볼의 최대 집합에 대해 반드시 WeakRef 를 비울 필요는 없습니다.
구현체가 live 가 아닌 S 집합에 대해 WeakRef 를 비우기로 선택했다면, 이 정의는
S 의 모든 값에 대해 동시에 WeakRef 를 비워야
함을 요구합니다. 즉, 구현체가
v 를 가리키는 WeakRef 만 비우고, 나머지 WeakRef 를 그대로 두어
v 의 값을
관찰할 수 있다면, 이는 준수(conformant)하지 않습니다.
9.9.4 호스트 훅
9.9.4.1 HostEnqueueFinalizationRegistryCleanupJob (
finalizationRegistry )
호스트
정의
추상 연산 HostEnqueueFinalizationRegistryCleanupJob은 finalizationRegistry
(FinalizationRegistry )를
인자로 받아 unused 를 반환합니다.
cleanupJob 을 finalizationRegistry 를 캡처하고, 호출 시 다음 단계를 수행하는 파라미터 없는
잡 추상
클로저 로 둔다:
cleanupResult 를 Completion (CleanupFinalizationRegistry (finalizationRegistry ))로
둔다.
cleanupResult 가 abrupt
completion 이라면, 오류 리포팅을 위한 호스트 정의 단계를 수행한다.
unused 를 반환한다.
HostEnqueueFinalizationRegistryCleanupJob의 구현은 cleanupJob 을 미래의 어느 시점에 실행하도록
예약합니다(가능하다면). 또한 9.5 의 요구사항을 따라야 합니다.
9.10 ClearKeptObjects ( )
ClearKeptObjects 추상 연산은 인자를 받지 않으며 unused 를 반환합니다. ECMAScript 구현은 동기적
ECMAScript 실행 시퀀스가 완료될 때 ClearKeptObjects를 호출해야 합니다. 호출 시 다음 단계를 수행합니다:
agentRecord 를 상위 에이전트 의 에이전트 레코드 로 둔다.
agentRecord .[[KeptAlive]] 를 새로운 빈 List 로 설정한다.
unused 를 반환한다.
9.11 AddToKeptObjects ( value )
AddToKeptObjects 추상 연산은 value (객체 또는 심볼)를 인자로 받아 unused 를 반환합니다.
호출 시
다음 단계를 수행합니다:
agentRecord 를 상위 에이전트 의 에이전트 레코드 로 둔다.
agentRecord .[[KeptAlive]] 에 value 를 추가한다.
unused 를 반환한다.
참고
AddToKeptObjects 추상 연산이 대상 객체나 심볼로 호출되면, 대상은
ClearKeptObjects 가 호출될
때까지 해당 대상을 강하게 참조하는
목록에 추가됩니다.
9.12 CleanupFinalizationRegistry ( finalizationRegistry )
CleanupFinalizationRegistry 추상 연산은 finalizationRegistry (FinalizationRegistry )를 인자로
받아
unused를 포함하는 정상 완료 또는
throw completion 을 반환합니다.
호출
시 다음 단계를 수행합니다:
Assert :
finalizationRegistry 는 [[Cells]] 와 [[CleanupCallback]] 내부 슬롯을 가진다.
callback 를 finalizationRegistry .[[CleanupCallback]] 로 둔다.
finalizationRegistry .[[Cells]] 에 레코드
cell 이
있고 cell .[[WeakRefTarget]] 가
empty 인
동안, 구현체는 다음 단계를 수행할 수 있다:
그런 cell 중 아무거나 선택한다.
finalizationRegistry .[[Cells]] 에서
cell 을 제거한다.
? HostCallJobCallback (callback ,
undefined , « cell .[[HeldValue]] »)를 수행한다.
unused 를 반환한다.
9.13 CanBeHeldWeakly ( v )
CanBeHeldWeakly 추상 연산은 v (ECMAScript 언어 값 )를 인자로
받아
불리언을 반환합니다. v 가 약 참조로 사용하기에 적합할 때에만 true 를 반환합니다. 약 참조로 사용하기에 적합한 값만
WeakMap의 키, WeakSet의 요소, WeakRef 의 대상, 또는 FinalizationRegistry 의 대상 중
하나가
될 수 있습니다. 호출 시 다음 단계를 수행합니다:
v 가 객체 라면, true 를 반환한다.
v 가 심볼 이고 KeyForSymbol (v )가
undefined 라면, true 를 반환한다.
false 를 반환한다.
참고
언어 정체성(language
identity) 이 없는 언어 값은 사전 참조 없이 나타날 수 있으므로 약 참조로 사용하기에 부적합합니다.
Symbol.for 로 생성된 Symbol 값은 다른 Symbol 값과 달리
언어
정체성이 없으므로 약 참조로 사용하기에 부적합합니다. well-known 심볼 은 거의 수집되지 않지만, 그 수가
제한적이므로 다양한 구현 방식으로 관리 가능해 약 참조로 사용에 적합하다고 봅니다. 그러나 live WeakMap에 well-known 심볼에
연관된
값이 있다면, 해당 값은 거의 수집되지 않으며 구현체에 따라 메모리 리소스가 "누수"될 수 있습니다.
10 일반 객체와 익조틱 객체의 동작
10.1 일반 객체 내부 메서드와 내부 슬롯
모든 일반 객체 는
[[Prototype]] 이라는 내부 슬롯을 갖습니다.
이 내부 슬롯의 값은 null 또는 객체이며, 상속을 구현하는 데 사용됩니다. 만약 속성 P 가 일반 객체
O 에
존재하지 않고, [[Prototype]] 객체에 존재한다면, P 가 [[Prototype]] 객체의 데이터 프로퍼티 를 참조하는 경우, O 는 get 접근에 대해 상속하여
P 가 마치 O 의 프로퍼티인 것처럼 동작합니다. P 가 [[Prototype]]
객체의
쓰기 가능한 데이터
프로퍼티 를 참조하면, O 에서 P 에 set 접근 시 O 에
P 라는
새로운 데이터
프로퍼티 가
생성됩니다. P 가 [[Prototype]] 객체의 쓰기 불가능한 데이터 프로퍼티 를 참조하면,
O 에서 P 에 set 접근이 실패합니다. P 가 [[Prototype]] 객체의
접근자 프로퍼티 를
참조하면, 접근자는 O 에 대해 get/set 모두 상속됩니다.
모든 일반 객체 는
불리언
값의 [[Extensible]] 내부 슬롯을 가지며, 이는 6.1.7.3 에 명시된 확장성 관련
내부
메서드 불변식을 충족시키는 데 사용됩니다. 즉, 객체의 [[Extensible]] 내부 슬롯 값이
false 로 설정되면, 더 이상 객체에 프로퍼티를 추가하거나, [[Prototype]] 내부 슬롯을
수정하거나, [[Extensible]] 값을 다시 true 로 변경할 수 없습니다.
이후 알고리즘 설명에서, O 는 일반 객체 , P 는 프로퍼티 키 값, V 는 임의의 ECMAScript 언어 값 , Desc 는
프로퍼티 디스크립터 레코드라 가정합니다.
각 일반 객체 내부
메서드는 같은 이름의 추상 연산에 위임합니다. 만약 그러한 추상 연산이 다른 내부 메서드에 의존하면, 직접 추상 연산을 호출하는 대신 O 에서 내부 메서드를
호출합니다.
이러한 의미론은 익조틱
객체 에
대해 일반 객체
내부
메서드를 적용할 때, 오버라이드된 내부 메서드가 호출되도록 보장합니다.
10.1.1 [[GetPrototypeOf]] ( )
일반 객체
O 의 [[GetPrototypeOf]] 내부 메서드는 인자를 받지 않으며, 객체 또는
null 을 포함하는 정상 완료 를
반환합니다.
호출 시 다음 단계를 수행합니다:
OrdinaryGetPrototypeOf (O )를
반환한다.
10.1.1.1 OrdinaryGetPrototypeOf ( O )
OrdinaryGetPrototypeOf 추상 연산은 O (객체)를 인자로 받아, 객체 또는 null 을
반환합니다. 호출
시 다음 단계를 수행합니다:
O .[[Prototype]] 을 반환한다.
10.1.2 [[SetPrototypeOf]] ( V )
일반 객체
O 의 [[SetPrototypeOf]] 내부 메서드는 V (객체 또는
null )를 인자로 받아, 불리언을 포함하는 정상 완료 를 반환합니다. 호출 시 다음
단계를
수행합니다:
OrdinarySetPrototypeOf (O ,
V )를 반환한다.
10.1.2.1 OrdinarySetPrototypeOf ( O , V )
OrdinarySetPrototypeOf 추상 연산은 O (객체), V (객체 또는
null )를
인자로 받아 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:
current 를 O .[[Prototype]] 으로 둔다.
SameValue (V ,
current )가 true 라면, true 를 반환한다.
extensible 을 O .[[Extensible]] 로 둔다.
extensible 이 false 라면, false 를 반환한다.
p 를 V 로 둔다.
done 을 false 로 둔다.
반복: done 이 false 인
동안,
p 가 null 이면,
done 을 true 로 설정한다.
그 외 SameValue (p ,
O )가 true 이면,
false 를 반환한다.
그 외,
p .[[GetPrototypeOf]] 가 일반
객체 내부 메서드(10.1.1 )가
아니라면, done 을 true 로 설정한다.
그 외, p 를 p .[[Prototype]] 으로
설정한다.
O .[[Prototype]] 을 V 로 설정한다.
true 를 반환한다.
참고
7 단계의 루프는 일반
객체 정의의 [[GetPrototypeOf]] , [[SetPrototypeOf]] 만을 사용하는 객체만 포함된 프로토타입 체인에 순환이 없음을 보장합니다.
10.1.3 [[IsExtensible]] ( )
일반 객체
O 의 [[IsExtensible]] 내부 메서드는 인자를 받지 않으며, 불리언을 포함하는 정상 완료 를 반환합니다. 호출 시 다음
단계를
수행합니다:
OrdinaryIsExtensible (O )를
반환한다.
10.1.3.1 OrdinaryIsExtensible ( O )
OrdinaryIsExtensible 추상 연산은 O (객체)를 인자로 받아 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:
O .[[Extensible]] 을 반환한다.
10.1.4 [[PreventExtensions]] ( )
일반 객체
O 의 [[PreventExtensions]] 내부 메서드는 인자를 받지 않으며,
true 를 포함하는 정상 완료 를
반환합니다.
호출 시 다음 단계를 수행합니다:
OrdinaryPreventExtensions (O )를
반환한다.
10.1.4.1 OrdinaryPreventExtensions ( O )
OrdinaryPreventExtensions 추상 연산은 O (객체)를 인자로 받아 true 를 반환합니다. 호출
시
다음 단계를 수행합니다:
O .[[Extensible]] 를 false 로
설정한다.
true 를 반환한다.
10.1.5 [[GetOwnProperty]] ( P )
일반 객체
O 의 [[GetOwnProperty]] 내부 메서드는 P (프로퍼티 키 )를 인자로 받아,
프로퍼티 디스크립터 또는
undefined 를 포함하는 정상 완료 를
반환합니다.
호출 시 다음 단계를 수행합니다:
OrdinaryGetOwnProperty (O ,
P )를 반환한다.
10.1.5.1 OrdinaryGetOwnProperty ( O , P )
OrdinaryGetOwnProperty 추상 연산은 O (객체), P (프로퍼티 키 )를 인자로 받아, 프로퍼티 디스크립터 또는
undefined 를 반환합니다. 호출 시 다음 단계를 수행합니다:
O 에 키 P 를 가진 자체 프로퍼티가 없으면, undefined 를 반환한다.
D 를 필드가 없는 새 프로퍼티
디스크립터 로 둔다.
X 를 O 의 키 P 를 가진 자체 프로퍼티로 둔다.
X 가 데이터 프로퍼티 이면,
D .[[Value]] 를 X 의 [[Value]] 특성 값으로 설정한다.
D .[[Writable]] 를 X 의 [[Writable]] 특성 값으로 설정한다.
그 외,
Assert :
X 는 접근자 프로퍼티 이다.
D .[[Get]] 을 X 의 [[Get]] 특성 값으로 설정한다.
D .[[Set]] 을 X 의 [[Set]] 특성 값으로 설정한다.
D .[[Enumerable]] 을 X 의 [[Enumerable]] 특성 값으로 설정한다.
D .[[Configurable]] 을 X 의 [[Configurable]] 특성 값으로 설정한다.
D 를 반환한다.
10.1.6 [[DefineOwnProperty]] (
P , Desc )
일반 객체
O 의 [[DefineOwnProperty]] 내부 메서드는 P (프로퍼티 키 ),
Desc (프로퍼티 디스크립터 )를 인자로 받아,
불리언을
포함하는 정상 완료 또는 throw completion 을 반환합니다.
호출
시 다음 단계를 수행합니다:
? OrdinaryDefineOwnProperty (O ,
P , Desc )를 반환한다.
10.1.6.1 OrdinaryDefineOwnProperty ( O , P ,
Desc )
OrdinaryDefineOwnProperty 추상 연산은 O (객체), P (프로퍼티 키 ),
Desc (프로퍼티
디스크립터 )를 인자로 받아,
불리언을 포함하는 정상 완료 또는 throw completion 을
반환합니다.
호출 시 다음 단계를 수행합니다:
current 를 ? O .[[GetOwnProperty]] (P )로 둔다.
extensible 을 ? IsExtensible (O )로 둔다.
ValidateAndApplyPropertyDescriptor (O ,
P , extensible , Desc , current )를 반환한다.
10.1.6.2 IsCompatiblePropertyDescriptor ( Extensible ,
Desc , Current )
IsCompatiblePropertyDescriptor 추상 연산은 Extensible (불리언), Desc (프로퍼티 디스크립터 ),
Current (프로퍼티
디스크립터 또는 undefined )를 인자로 받아 불리언을 반환합니다. 호출 시 다음
단계를
수행합니다:
ValidateAndApplyPropertyDescriptor (undefined ,
"" , Extensible , Desc , Current )를
반환한다.
10.1.6.3 ValidateAndApplyPropertyDescriptor ( O ,
P , extensible , Desc , current )
추상 연산 ValidateAndApplyPropertyDescriptor는 O (객체 또는 undefined ),
P (프로퍼티
키 ), extensible (불리언), Desc (프로퍼티 디스크립터 ),
current (프로퍼티
디스크립터 또는 undefined )를 인자로 받고, 불리언을 반환한다.
Desc 가 지정된 extensibility 와 현재 프로퍼티 current 를 가진 객체의 프로퍼티로써 적용
가능하여
불변성 을 유지할 수
있을 때,
그리고 그 경우에만 true 를 반환한다.
그런 적용이 가능하고 O 가 undefined 가 아니면 프로퍼티 이름 P 에 대해 실제로
적용한다(필요하다면 생성). 호출 시 다음 단계를 수행한다:
Assert :
P 는 프로퍼티
키 이다.
current 가 undefined 라면,
extensible 가 false 라면 false 를
반환한다.
O 가 undefined 라면 true 를 반환한다.
IsAccessorDescriptor (Desc )
가 true 라면,
객체 O 에 이름이 P 인 자신의 접근자 프로퍼티 를
생성한다. 이 프로퍼티의 [[Get]] , [[Set]] , [[Enumerable]] , [[Configurable]] 속성은 Desc 에 해당 필드가
있으면
그 값으로, 없으면 기본값 으로
설정한다.
그 외의 경우,
객체 O 에 이름이 P 인 자신의 데이터 프로퍼티 를
생성한다. 이 프로퍼티의 [[Value]] , [[Writable]] , [[Enumerable]] , [[Configurable]] 속성은 Desc 에 해당 필드가
있으면
그 값으로, 없으면 기본값 으로
설정한다.
true 를 반환한다.
Assert :
current 는 모든 필드가 채워진
프로퍼티
디스크립터 이다.
Desc 가 아무 필드도 갖고 있지 않으면 true 를 반환한다.
current .[[Configurable]] 가
false 라면,
Desc 에 [[Configurable]] 필드가 있고
Desc .[[Configurable]] 가
true 라면 false 를 반환한다.
Desc 에 [[Enumerable]] 필드가 있고
Desc .[[Enumerable]] 가
current .[[Enumerable]] 와 다르면
false 를 반환한다.
IsGenericDescriptor (Desc )
가 false 이고, IsAccessorDescriptor (Desc )
가 IsAccessorDescriptor (current )와
다르면
false 를 반환한다.
IsAccessorDescriptor (current )
가 true 라면,
Desc 에 [[Get]] 필드가 있고 SameValue (Desc .[[Get]] , current .[[Get]] )가 false 라면
false 를 반환한다.
Desc 에 [[Set]] 필드가 있고 SameValue (Desc .[[Set]] , current .[[Set]] )가 false 라면
false 를 반환한다.
그 외에 current .[[Writable]] 가
false 라면,
Desc 에 [[Writable]] 필드가 있고
Desc .[[Writable]] 가
true 라면 false 를 반환한다.
참고: SameValue 는
NaN 값에 대해 true 를 반환하지만, 다른
방식으로는
구분될 수 있다. 여기서 반환하는 것은 객체 O 의 기존 프로퍼티가 변경되지 않음을 보장한다.
Desc 에 [[Value]] 필드가 있으면,
SameValue (Desc .[[Value]] , current .[[Value]] )를 반환한다.
O 가 undefined 가 아니면,
IsDataDescriptor (current )
가 true 이고 IsAccessorDescriptor (Desc )
가 true 라면,
Desc 에 [[Configurable]] 필드가 있으면
configurable 을 Desc .[[Configurable]] 로, 없으면
current .[[Configurable]] 로 둔다.
Desc 에 [[Enumerable]] 필드가 있으면
enumerable 을 Desc .[[Enumerable]] 로, 없으면 current .[[Enumerable]] 로 둔다.
객체 O 의 이름이 P 인 프로퍼티를 접근자 프로퍼티 로 교체한다. [[Configurable]] 및 [[Enumerable]] 속성은 각각
configurable 과
enumerable 로, [[Get]] 및 [[Set]] 속성은 Desc 에 해당 필드가 있으면 그 값,
없으면
기본값 으로
설정한다.
그 외에 IsAccessorDescriptor (current )
가 true 이고 IsDataDescriptor (Desc )
가 true 라면,
Desc 에 [[Configurable]] 필드가 있으면
configurable 을 Desc .[[Configurable]] 로, 없으면
current .[[Configurable]] 로 둔다.
Desc 에 [[Enumerable]] 필드가 있으면
enumerable 을 Desc .[[Enumerable]] 로, 없으면 current .[[Enumerable]] 로 둔다.
객체 O 의 이름이 P 인 프로퍼티를 데이터 프로퍼티 로 교체한다. [[Configurable]] 및 [[Enumerable]] 속성은 각각
configurable 과
enumerable 로, [[Value]] 및 [[Writable]] 속성은 Desc 에 해당 필드가 있으면
그
값, 없으면 기본값 으로
설정한다.
그 외의 경우,
Desc 의 각 필드에 대해, 객체 O 의 이름이 P 인 프로퍼티의
해당
속성을 그 값으로 설정한다.
true 를 반환한다.
10.1.7 [[HasProperty]] ( P )
일반 객체
O 의 [[HasProperty]] 내부 메서드는 P (프로퍼티 키 )를 인자로 받아,
불리언을
포함하는 정상 완료 또는 throw completion 을 반환한다.
호출 시
다음 단계를 수행한다:
? OrdinaryHasProperty (O ,
P )를 반환한다.
10.1.7.1 OrdinaryHasProperty ( O , P )
OrdinaryHasProperty 추상 연산은 O (객체)와 P (프로퍼티 키 )를 인자로 받아, 불리언을 포함하는
정상 완료 또는 throw completion 을
반환한다.
호출 시 다음 단계를 수행한다:
hasOwn 을 ? O .[[GetOwnProperty]] (P )로 둔다.
hasOwn 이 undefined 가 아니면 true 를 반환한다.
parent 를 ? O .[[GetPrototypeOf]] ()로 둔다.
parent 가 null 이 아니면,
? parent .[[HasProperty]] (P )를 반환한다.
false 를 반환한다.
10.1.8 [[Get]] ( P ,
Receiver )
일반 객체
O 의 [[Get]] 내부 메서드는 P (프로퍼티 키 ),
Receiver (ECMAScript 언어 값 )를 인자로 받아, ECMAScript 언어 값 를 포함하는 정상 완료 또는 throw completion 을 반환한다.
호출 시
다음 단계를 수행한다:
? OrdinaryGet (O , P ,
Receiver )를 반환한다.
10.1.8.1 OrdinaryGet ( O , P ,
Receiver )
OrdinaryGet 추상 연산은 O (객체), P (프로퍼티 키 ), Receiver
(ECMAScript 언어 값 )를 인자로 받아,
ECMAScript 언어 값 를 포함하는 정상 완료 또는 throw completion 을
반환한다.
호출 시 다음 단계를 수행한다:
desc 를 ? O .[[GetOwnProperty]] (P )로 둔다.
desc 가 undefined 이면,
parent 를 ? O .[[GetPrototypeOf]] ()로 둔다.
parent 가 null 이면 undefined 를
반환한다.
? parent .[[Get]] (P ,
Receiver )를 반환한다.
IsDataDescriptor (desc )
가 true 이면 desc .[[Value]] 를
반환한다.
Assert :
IsAccessorDescriptor (desc )
가 true 이다.
getter 를 desc .[[Get]] 로 둔다.
getter 가 undefined 이면 undefined 를
반환한다.
? Call (getter ,
Receiver )를 반환한다.
10.1.9 [[Set]] ( P ,
V , Receiver )
일반 객체
O 의 [[Set]] 내부 메서드는 P (프로퍼티 키 ),
V (ECMAScript 언어 값 ),
Receiver
(ECMAScript 언어 값 )를 인자로 받아, 불리언을 포함하는
정상 완료 또는 throw completion 을 반환한다.
호출 시
다음 단계를 수행한다:
? OrdinarySet (O , P ,
V , Receiver )를 반환한다.
10.1.9.1 OrdinarySet ( O , P , V ,
Receiver )
OrdinarySet 추상 연산은 O (객체), P (프로퍼티 키 ), V (ECMAScript 언어 값 ),
Receiver (ECMAScript 언어 값 )를 인자로 받아, 불리언을
포함하는
정상 완료 또는 throw completion 을
반환한다.
호출 시 다음 단계를 수행한다:
ownDesc 를 ? O .[[GetOwnProperty]] (P )로 둔다.
? OrdinarySetWithOwnDescriptor (O ,
P , V , Receiver , ownDesc )를 반환한다.
10.1.9.2 OrdinarySetWithOwnDescriptor ( O ,
P , V , Receiver , ownDesc )
OrdinarySetWithOwnDescriptor 추상 연산은 O (객체), P (프로퍼티 키 ),
V (ECMAScript 언어 값 ),
Receiver (ECMAScript 언어 값 ),
ownDesc (프로퍼티
디스크립터 또는 undefined )를 인자로 받아, 불리언을 포함하는 정상 완료 또는 throw completion 을
반환한다.
호출 시 다음 단계를 수행한다:
ownDesc 가 undefined 라면,
parent 를 ? O .[[GetPrototypeOf]] ()로 둔다.
parent 가 null 이 아니면,
? parent .[[Set]] (P ,
V , Receiver )를 반환한다.
그 외의 경우,
ownDesc 를 PropertyDescriptor { [[Value]] : undefined ,
[[Writable]] : true , [[Enumerable]] : true ,
[[Configurable]] :
true }로 설정한다.
IsDataDescriptor (ownDesc )
가 true 라면,
ownDesc .[[Writable]] 가
false 이면 false 를 반환한다.
Receiver 가 객체가 아니면
false 를
반환한다.
existingDescriptor 를 ? Receiver .[[GetOwnProperty]] (P )로 둔다.
existingDescriptor 가 undefined 가 아니면,
IsAccessorDescriptor (existingDescriptor )
가 true 이면 false 를 반환한다.
existingDescriptor .[[Writable]] 가
false 이면 false 를 반환한다.
valueDesc 를 PropertyDescriptor { [[Value]] : V }로 둔다.
? Receiver .[[DefineOwnProperty]] (P ,
valueDesc )를 반환한다.
그 외의 경우,
Assert : Receiver
에는 현재 P 프로퍼티가 없다.
? CreateDataProperty (Receiver ,
P , V )를 반환한다.
Assert :
IsAccessorDescriptor (ownDesc )
가 true 이다.
setter 를 ownDesc .[[Set]] 로 둔다.
setter 가 undefined 이면 false 를 반환한다.
? Call (setter ,
Receiver , « V »)를 수행한다.
true 를 반환한다.
10.1.10 [[Delete]] ( P )
일반 객체
O 의 [[Delete]] 내부 메서드는 P (프로퍼티 키 )를 인자로 받고,
불리언을
포함하는 정상 완료 또는 throw completion 을 반환한다.
호출 시
다음 단계를 수행한다:
? OrdinaryDelete (O , P )를
반환한다.
10.1.10.1 OrdinaryDelete ( O , P )
OrdinaryDelete 추상 연산은 O (객체)와 P (프로퍼티 키 )를 인자로 받아, 불리언을 포함하는
정상 완료 또는 throw completion 을
반환한다.
호출 시 다음 단계를 수행한다:
desc 를 ? O .[[GetOwnProperty]] (P )로 둔다.
desc 가 undefined 이면 true 를 반환한다.
desc .[[Configurable]] 가
true 이면,
O 에서 이름이 P 인 자신의 프로퍼티를 제거한다.
true 를 반환한다.
false 를 반환한다.
10.1.11 [[OwnPropertyKeys]] ( )
일반 객체
O 의 [[OwnPropertyKeys]] 내부 메서드는 인자를 받지 않으며, 프로퍼티 키의 리스트 를 포함하는
정상 완료 를 반환한다. 호출 시 다음 단계를
수행한다:
OrdinaryOwnPropertyKeys (O )를
반환한다.
10.1.11.1 OrdinaryOwnPropertyKeys ( O )
OrdinaryOwnPropertyKeys 추상 연산은 O (객체)를 인자로 받아, 프로퍼티 키 의 리스트 를 반환한다. 호출 시 다음 단계를
수행한다:
keys 를 새로운 빈 List 로 둔다.
O 의 각 자신의 프로퍼티 키 P 중, P 가
배열
인덱스 인 경우, 숫자 인덱스 오름차순으로,
P 를 keys 에 추가한다.
O 의 각 자신의 프로퍼티 키 P 중, P 가
문자열 이고
배열
인덱스 가 아닌
경우, 프로퍼티 생성 시점 오름차순으로,
P 를 keys 에 추가한다.
O 의 각 자신의 프로퍼티 키 P 중, P 가
심볼 인 경우,
프로퍼티 생성
시점 오름차순으로,
P 를 keys 에 추가한다.
keys 를 반환한다.
10.1.12 OrdinaryObjectCreate ( proto [ ,
additionalInternalSlotsList ] )
OrdinaryObjectCreate 추상 연산은 proto (객체 또는 null ), 선택적
additionalInternalSlotsList (내부 슬롯 이름의
리스트 )를
인자로 받아 객체를 반환한다. 이는 새로운 일반 객체 의 런타임 생성을 명세하는 데 사용된다.
additionalInternalSlotsList 에는 [[Prototype]] , [[Extensible]] 외에 객체의 일부로 정의되어야 하는 추가 내부 슬롯의 이름이 포함된다.
additionalInternalSlotsList 가 생략되면, 새로운 빈 List 가 사용된다. 호출 시 다음 단계를
수행한다:
internalSlotsList 를 « [[Prototype]] , [[Extensible]] »로 둔다.
additionalInternalSlotsList 가 있으면, internalSlotsList 를 리스트
연결 결과(internalSlotsList +
additionalInternalSlotsList )로 설정한다.
O 를 MakeBasicObject (internalSlotsList )로
둔다.
O .[[Prototype]] 을 proto 로 설정한다.
O 를 반환한다.
참고
OrdinaryObjectCreate는 MakeBasicObject 만 호출하는 것처럼 보이지만, 이 연산을
사용하는 것은 일반
객체 (exotic이 아님)를 생성하려는 의도를 명확히 전달합니다. 따라서, 이 명세 내에서
OrdinaryObjectCreate를 호출한 후 그 객체의 내부 메서드를 변경해서 exotic으로 만드는 알고리즘은 없습니다. exotic
객체 를
생성하는 연산은 직접 MakeBasicObject 를 호출합니다.
10.1.13 OrdinaryCreateFromConstructor ( constructor ,
intrinsicDefaultProto [ , internalSlotsList ] )
OrdinaryCreateFromConstructor 추상 연산은 constructor (함수 객체 ),
intrinsicDefaultProto (문자열), 선택적 internalSlotsList (내부 슬롯 이름의 리스트 )를 인자로 받아,
객체를
포함하는 정상 완료 또는 throw completion 을 반환한다.
이는
[[Prototype]] 값을 constructor 의 "prototype" 프로퍼티에서
가져오고,
없으면 intrinsicDefaultProto 로 지정된 intrinsic을 사용하는 일반 객체 를 생성한다.
internalSlotsList 에는 객체의 일부로 정의해야 하는 추가 내부 슬롯의 이름이 들어있다. internalSlotsList 가
생략되면, 새로운 빈 List 가 사용된다. 호출 시 다음 단계를
수행한다:
Assert :
intrinsicDefaultProto 는 명세에서 정의한 intrinsic 객체의 이름이다. 해당 객체는 객체의 [[Prototype]] 값으로 사용하도록 지정된 intrinsic이어야 한다.
proto 를 ? GetPrototypeFromConstructor (constructor ,
intrinsicDefaultProto )로 둔다.
internalSlotsList 가 있으면 slotsList 를 internalSlotsList 로
둔다.
그 외에는 slotsList 를 새로운 빈 List 로
둔다.
OrdinaryObjectCreate (proto ,
slotsList )를 반환한다.
10.1.14 GetPrototypeFromConstructor ( constructor ,
intrinsicDefaultProto )
GetPrototypeFromConstructor 추상 연산은 constructor (함수 객체 ),
intrinsicDefaultProto (문자열)를 인자로 받아, 객체를 포함하는 정상 완료 또는 throw completion 을 반환한다.
이는
특정 constructor 에
대해 객체를 만들 때 사용할 [[Prototype]] 값을 결정한다. 값은 constructor 의
"prototype"
프로퍼티에서 가져오고, 없으면 intrinsicDefaultProto 로 지정된 intrinsic이 사용된다. 호출 시 다음 단계를 수행한다:
Assert :
intrinsicDefaultProto 는 명세에서 정의한 intrinsic 객체의 이름이다. 해당 객체는 객체의 [[Prototype]] 값으로 사용하도록 지정된 intrinsic이어야 한다.
proto 를 ? Get (constructor ,
"prototype" )로 둔다.
proto 가 객체가 아니면 ,
realm 을 ? GetFunctionRealm (constructor )로
둔다.
proto 를 realm 의 intrinsicDefaultProto 이름의
intrinsic
객체로 설정한다.
proto 를 반환한다.
참고
constructor 가 [[Prototype]] 값을 제공하지 않으면, 사용되는 기본값은
realm 에서 가져오며,
실행 중인 실행 컨텍스트 에서 가져오지 않는다.
10.1.15 RequireInternalSlot ( O , internalSlot
)
RequireInternalSlot 추상 연산은 O (ECMAScript 언어 값 ),
internalSlot (내부 슬롯 이름)을 인자로 받아, unused 를 포함하는 정상 완료 또는 throw completion 을 반환한다.
O 가 객체 가 아니거나 해당 내부 슬롯이 없으면 예외를 던진다. 호출 시 다음 단계를 수행한다:
O 가 객체가 아니면 TypeError 예외를
던진다.
O 에 internalSlot 내부 슬롯이 없으면 TypeError 예외를 던진다.
unused 를 반환한다.
10.2 ECMAScript 함수 객체
ECMAScript 함수
객체 는 렉시컬 환경을 닫아 매개변수를 가진 ECMAScript 코드를 캡슐화하고, 그 코드의 동적 평가를 지원합니다. ECMAScript
함수 객체 는
일반 객체 이며,
다른
일반 객체 와
동일한 내부
슬롯과 내부 메서드를 가집니다. ECMAScript 함수 객체 의 코드는 엄격 모드 코드 (11.2.2 ) 또는
비엄격 코드 일 수
있습니다. ECMAScript 함수
객체 중 그 코드가 엄격 모드 코드 인 것을 엄격 함수 라 합니다. 코드가 엄격 모드
코드 가
아닌 것은 비엄격 함수 라 합니다.
[[Extensible]] 와 [[Prototype]] 외에, ECMAScript
함수 객체 는
표 30 에 나열된 내부 슬롯도
가집니다.
표 30: ECMAScript 함수 객체의 내부 슬롯
내부 슬롯
타입
설명
[[Environment]]
환경 레코드
함수가 닫힌 환경 레코드 . 함수 코드 평가 시 외부
환경으로
사용됩니다.
[[PrivateEnvironment]]
PrivateEnvironment 레코드
또는
null
함수가 닫힌 PrivateEnvironment 레코드 .
이
함수가 클래스 내부에 있지 않으면 null 입니다. 내부 클래스 코드 평가 시 외부
PrivateEnvironment로
사용됩니다.
[[FormalParameters]]
파스 노드
함수의 형식적 매개변수 목록을 정의하는 소스 텍스트의 루트 파스 노드입니다.
[[ECMAScriptCode]]
파스 노드
함수 본문을 정의하는 소스 텍스트의 루트 파스 노드입니다.
[[ConstructorKind]]
base 또는 derived
함수가 파생 클래스 생성자 인지 여부입니다.
[[Realm]]
Realm
Record
함수가 생성된 realm 이며, 함수 평가 시 접근되는 intrinsic 객체를 제공합니다.
[[ScriptOrModule]]
Script
Record 또는 Module
Record
함수가 생성된 스크립트 또는 모듈입니다.
[[ThisMode]]
lexical , strict , 또는
global
함수의 형식 매개변수 및 코드 본문 내에서 this 참조가 해석되는 방식을 정의합니다.
lexical 은 this가 렉시컬 상위 함수의
this 값을 참조함을 의미합니다. strict 는 함수 호출 시
제공된
this 값을 그대로 사용함을 의미합니다. global 은
this 값이 undefined 또는
null 이면
글로벌
객체 로 해석하고, 그 외의 값은 ToObject 를 거쳐 객체로
변환합니다.
[[Strict]]
불리언
true 면 엄격 함수 , false 면
비엄격 함수 입니다.
[[HomeObject]]
객체
함수가 super를 사용할 경우, super 프로퍼티 탐색이 시작되는 객체의 [[GetPrototypeOf]] 를 제공합니다.
[[SourceText]]
유니코드 코드 포인트의 시퀀스
함수를 정의하는 소스 텍스트 입니다.
[[Fields]]
레코드 리스트
(ClassFieldDefinition
레코드 )
함수가 클래스일 경우, 클래스의 비정적 필드 및 해당 이니셜라이저를 나타내는 레코드
리스트입니다.
[[PrivateMethods]]
레코드 리스트
(PrivateElement )
함수가 클래스일 경우, 클래스의 비정적 private 메서드 및 접근자를 나타내는 리스트입니다.
[[ClassFieldInitializerName]]
문자열, 심볼, Private Name , 또는
empty
함수가 클래스 필드의 이니셜라이저로 생성된 경우, 필드의 NamedEvaluation 에
사용할 이름입니다. 그렇지 않으면 empty 입니다.
[[IsClassConstructor]]
불리언
함수가 클래스 생성자 인지 나타냅니다.
(true 이면
함수의 [[Call]] 을 호출하는 즉시 TypeError 예외가
발생합니다.)
모든 ECMAScript 함수
객체 는 여기에 정의된 [[Call]] 내부 메서드를 가집니다. 생성자 이기도 한 ECMAScript 함수는
[[Construct]] 내부 메서드도 추가로 가집니다.
10.2.1 [[Call]] ( thisArgument ,
argumentsList )
ECMAScript 함수
객체 F 의 [[Call]] 내부 메서드는
thisArgument (ECMAScript 언어 값 ),
argumentsList (ECMAScript 언어 값
리스트 )를 인자로 받아,
ECMAScript 언어 값 를 포함하는 정상 완료 또는 throw completion 을 반환한다.
호출 시
다음 단계를 수행한다:
callerContext 를 실행 중인 실행 컨텍스트 로 둔다.
calleeContext 를 PrepareForOrdinaryCall (F ,
undefined )로 둔다.
Assert :
calleeContext 가 이제 실행 중인 실행 컨텍스트 임을
보장한다.
F .[[IsClassConstructor]] 가
true 이면,
error 를 새로 생성된 TypeError 객체로 둔다.
참고: error 는 calleeContext 내에서 F 와 연관된 Realm
Record 에서 생성된다.
calleeContext 를 실행 컨텍스트
스택 에서
제거하고, callerContext 를 실행 중인 실행
컨텍스트 로 복원한다.
ThrowCompletion (error )를
반환한다.
OrdinaryCallBindThis (F ,
calleeContext , thisArgument )를 수행한다.
result 를 Completion (OrdinaryCallEvaluateBody (F ,
argumentsList ))로 둔다.
calleeContext 를 실행
컨텍스트 스택 에서 제거하고, callerContext 를 실행
중인 실행 컨텍스트 로 복원한다.
result 가 return
completion 이면 result .[[Value]] 를
반환한다.
Assert :
result 가 throw
completion 임을 보장한다.
? result 를 반환한다.
참고
실행 컨텍스트 스택 에서
calleeContext 가 7 단계에서 제거될 때, accessible
Generator에 의해 나중에 재개(resume)될 수 있도록 일시 정지(suspend) 상태라면 파괴되어서는 안 됩니다.
10.2.1.1 PrepareForOrdinaryCall ( F ,
newTarget )
추상 연산 PrepareForOrdinaryCall은 F (ECMAScript 함수 객체 ), newTarget
(객체 또는
undefined )를 인자로 받아 실행 컨텍스트 를 반환한다. 호출 시 다음
단계를 수행한다:
callerContext 를 실행 중인 실행
컨텍스트 로 둔다.
calleeContext 를 새로운 ECMAScript 코드 실행
컨텍스트 로 둔다.
calleeContext 의 Function을 F 로 설정한다.
calleeRealm 을 F .[[Realm]] 으로 둔다.
calleeContext 의 Realm 을 calleeRealm 으로 설정한다.
calleeContext 의 ScriptOrModule을 F .[[ScriptOrModule]] 로 설정한다.
localEnv 를 NewFunctionEnvironment (F ,
newTarget )로 둔다.
calleeContext 의 LexicalEnvironment를 localEnv 로 설정한다.
calleeContext 의 VariableEnvironment를 localEnv 로 설정한다.
calleeContext 의 PrivateEnvironment를 F .[[PrivateEnvironment]] 로 설정한다.
callerContext 가 이미 일시 정지(suspended) 상태가 아니면, callerContext 를 일시
정지시킨다.
calleeContext 를 실행 컨텍스트 스택 에
푸시한다;
calleeContext 는 이제 실행 중인 실행
컨텍스트 이다.
참고: 이 시점 이후 생성된 모든 예외 객체는 calleeRealm 과 연관된다.
calleeContext 를 반환한다.
10.2.1.2 OrdinaryCallBindThis ( F ,
calleeContext , thisArgument )
추상 연산 OrdinaryCallBindThis는 F (ECMAScript 함수 객체 ),
calleeContext
(실행
컨텍스트 ), thisArgument (ECMAScript 언어 값 )을 인자로 받아
unused 를 반환한다. 호출 시 다음 단계를 수행한다:
thisMode 를 F .[[ThisMode]] 로 둔다.
thisMode 가 lexical 이면 unused 를
반환한다.
calleeRealm 을 F .[[Realm]] 으로 둔다.
localEnv 를 calleeContext 의 LexicalEnvironment로 둔다.
thisMode 가 strict 이면,
thisValue 를 thisArgument 로 둔다.
그 외의 경우,
thisArgument 가 undefined 나
null 이면,
globalEnv 를 calleeRealm .[[GlobalEnv]] 로 둔다.
Assert : globalEnv 는
Global Environment
Record 이다.
thisValue 를 globalEnv .[[GlobalThisValue]] 로 둔다.
그 외에는,
thisValue 를 ! ToObject (thisArgument )로
둔다.
참고: ToObject 는
calleeRealm 을 사용해 래퍼 객체를 생성한다.
Assert :
localEnv 는 Function Environment
Record 이다.
Assert : 다음
단계는
localEnv .[[ThisBindingStatus]] 가
initialized 가 아니므로 abrupt
completion 을 반환하지 않는다.
! BindThisValue (localEnv ,
thisValue )를 수행한다.
unused 를 반환한다.
10.2.1.3 Runtime Semantics: EvaluateBody
구문 지시
연산(syntax-directed
operation) EvaluateBody는 functionObject (ECMAScript
함수
객체 ),
argumentsList (ECMAScript 언어 값
리스트 )를 인자로 받아 return
completion 또는 throw
completion 을 반환한다. 아래 프로덕션별로 정의된다:
FunctionBody :
FunctionStatementList
? EvaluateFunctionBody of FunctionBody with
arguments functionObject and argumentsList 를 반환한다.
ConciseBody :
ExpressionBody
? EvaluateConciseBody of ConciseBody with
arguments functionObject and argumentsList 를 반환한다.
GeneratorBody :
FunctionBody
? EvaluateGeneratorBody of GeneratorBody with
arguments functionObject and argumentsList 를 반환한다.
AsyncGeneratorBody
: FunctionBody
? EvaluateAsyncGeneratorBody of AsyncGeneratorBody
with
arguments functionObject and argumentsList 를 반환한다.
AsyncFunctionBody
: FunctionBody
? EvaluateAsyncFunctionBody of AsyncFunctionBody
with arguments functionObject and argumentsList 를 반환한다.
AsyncConciseBody
: ExpressionBody
? EvaluateAsyncConciseBody of AsyncConciseBody
with arguments functionObject and argumentsList 를 반환한다.
Initializer :
=
AssignmentExpression
Assert :
argumentsList 는 비어 있다.
Assert :
functionObject .[[ClassFieldInitializerName]] 이
empty 가 아니다.
IsAnonymousFunctionDefinition (AssignmentExpression )가
true 라면,
value 를 ? NamedEvaluation of Initializer
with argument functionObject .[[ClassFieldInitializerName]] 로 둔다.
그 외에는,
rhs 를 ? Evaluation
of AssignmentExpression 로
둔다.
value 를 ? GetValue (rhs )로 둔다.
ReturnCompletion (value )를
반환한다.
참고
필드 이니셜라이저(Field initializer)는 함수 경계로 간주되지만, FunctionDeclarationInstantiation
호출은 관찰 가능한 효과가 없으므로 생략된다.
ClassStaticBlockBody
: ClassStaticBlockStatementList
Assert :
argumentsList 는 비어 있다.
? EvaluateClassStaticBlockBody of ClassStaticBlockBody with
argument functionObject 를 반환한다.
10.2.1.4 OrdinaryCallEvaluateBody ( F ,
argumentsList )
OrdinaryCallEvaluateBody 추상 연산은 F (ECMAScript 함수 객체 )와
argumentsList
(ECMAScript 언어 값의 리스트 )를
인자로
받아, return completion 또는
throw completion 을
반환한다.
호출 시 다음 단계를 수행한다:
? EvaluateBody of F .[[ECMAScriptCode]] with arguments F 및
argumentsList 를 반환한다.
10.2.2 [[Construct]] (
argumentsList , newTarget )
ECMAScript 함수
객체 F 의 [[Construct]] 내부 메서드는
argumentsList (ECMAScript 언어 값의
리스트 )와
newTarget (생성자 )를 인자로 받고, 객체를 포함하는 정상 완료 또는 throw completion 을 반환한다.
호출 시
다음 단계를 수행한다:
callerContext 를 실행 중인 실행 컨텍스트 로 둔다.
kind 를 F .[[ConstructorKind]] 로 둔다.
kind 가 base 이면,
thisArgument 를 ? OrdinaryCreateFromConstructor (newTarget ,
"%Object.prototype%" )로 둔다.
calleeContext 를 PrepareForOrdinaryCall (F ,
newTarget )로 둔다.
Assert :
calleeContext 가 현재 실행 중인 실행 컨텍스트 임을
보장한다.
kind 가 base 이면,
OrdinaryCallBindThis (F ,
calleeContext , thisArgument )를 수행한다.
initializeResult 를 Completion (InitializeInstanceElements (thisArgument ,
F ))로 둔다.
initializeResult 가 abrupt
completion 이면,
calleeContext 를 실행 컨텍스트
스택 에서 제거하고, callerContext 를 실행 중인 실행 컨텍스트 로
복원한다.
? initializeResult 를 반환한다.
constructorEnv 를 calleeContext 의 LexicalEnvironment로 둔다.
result 를 Completion (OrdinaryCallEvaluateBody (F ,
argumentsList ))로 둔다.
calleeContext 를 실행 컨텍스트 스택 에서 제거하고,
callerContext 를 실행 중인 실행 컨텍스트 로 복원한다.
result 가 throw
completion 이면,
? result 를 반환한다.
Assert :
result 가 return
completion 임을 보장한다.
result .[[Value]] 가 객체이면 ,
result .[[Value]] 를 반환한다.
kind 가 base 이면 thisArgument 를 반환한다.
result .[[Value]] 가 undefined 가 아니면
TypeError 예외를 던진다.
thisBinding 을 ? constructorEnv .GetThisBinding()으로 둔다.
Assert :
thisBinding 이 객체임 을 보장한다.
thisBinding 을 반환한다.
10.2.3 OrdinaryFunctionCreate ( functionPrototype ,
sourceText , ParameterList , Body , thisMode ,
env , privateEnv )
OrdinaryFunctionCreate 추상 연산은 functionPrototype (객체), sourceText (유니코드 코드
포인트
시퀀스), ParameterList (파스 노드 ), Body (파스
노드 ), thisMode (lexical-this 또는
non-lexical-this ), env (환경
레코드 ), privateEnv
(PrivateEnvironment 레코드 또는
null )를 인자로 받아, ECMAScript 함수 객체 를 반환한다. 이 연산은 기본 [[Call]] 내부 메서드를 가지며 [[Construct]] 내부 메서드는
없는(단,
MakeConstructor 와 같은 연산으로 추가될 수 있음) 새 함수를 런타임에
생성하는 데 사용된다. sourceText 는 생성할 함수의 문법 정의 소스 텍스트이다. 호출 시 다음 단계를 수행한다:
internalSlotsList 를 표 30 에
나열된
내부 슬롯으로 둔다.
F 를 OrdinaryObjectCreate (functionPrototype ,
internalSlotsList )로 둔다.
F .[[Call]] 을 10.2.1 에서
정의된 것으로 설정한다.
F .[[SourceText]] 를 sourceText 로 설정한다.
F .[[FormalParameters]] 를 ParameterList 로
설정한다.
F .[[ECMAScriptCode]] 를 Body 로 설정한다.
Strict 를 IsStrict (Body )로 둔다.
F .[[Strict]] 를 Strict 로 설정한다.
thisMode 가 lexical-this 이면 F .[[ThisMode]] 를 lexical 로 설정한다.
그 외에 Strict 가 true 이면 F .[[ThisMode]] 를 strict 로 설정한다.
그 외에는 F .[[ThisMode]] 를 global 로
설정한다.
F .[[IsClassConstructor]] 를 false 로
설정한다.
F .[[Environment]] 를 env 로 설정한다.
F .[[PrivateEnvironment]] 를 privateEnv 로
설정한다.
F .[[ScriptOrModule]] 를 GetActiveScriptOrModule ()로
설정한다.
F .[[Realm]] 을 현재 Realm Record 로 설정한다.
F .[[HomeObject]] 를 undefined 로
설정한다.
F .[[Fields]] 를 새로운 빈 List 로 설정한다.
F .[[PrivateMethods]] 를 새로운 빈 List 로 설정한다.
F .[[ClassFieldInitializerName]] 을
empty 로 설정한다.
len 을 ExpectedArgumentCount
of ParameterList 로 둔다.
SetFunctionLength (F ,
len )을 수행한다.
F 를 반환한다.
10.2.4 AddRestrictedFunctionProperties ( F ,
realm )
AddRestrictedFunctionProperties 추상 연산은 F (함수 객체 )와 realm (Realm Record )를
인자로 받아 unused 를 반환한다. 호출 시 다음 단계를 수행한다:
Assert :
realm .[[Intrinsics]] .[[%ThrowTypeError% ]]가 존재하며 초기화되어 있어야
한다.
thrower 를 realm .[[Intrinsics]] .[[%ThrowTypeError% ]]로 둔다.
! DefinePropertyOrThrow (F ,
"caller" , PropertyDescriptor { [[Get]] :
thrower , [[Set]] : thrower , [[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
! DefinePropertyOrThrow (F ,
"arguments" , PropertyDescriptor { [[Get]] :
thrower , [[Set]] : thrower , [[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
unused 를 반환한다.
10.2.4.1 %ThrowTypeError% ( )
이 함수는 %ThrowTypeError% intrinsic 객체이다.
이것은 각 realm 마다 하나씩 정의되는
익명 내장 함수
객체 이다.
호출 시 다음 단계를 수행한다:
TypeError 예외를 던진다.
이 함수의 [[Extensible]] 내부 슬롯의 값은 false 이다.
이 함수의 "length" 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }이다.
이 함수의 "name" 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }이다.
10.2.5 MakeConstructor ( F [ ,
writablePrototype [ , prototype ] ] )
추상 연산 MakeConstructor는 F (ECMAScript 함수 객체 또는 내장 함수 객체 ), 선택적
writablePrototype (불리언), prototype (객체)을 인자로 받아
unused 를 반환한다. 이 연산은 F 를 생성자 로 변환한다. 호출 시 다음 단계를 수행한다:
F 가 ECMAScript 함수 객체 라면,
Assert :
IsConstructor (F )가
false 임을 보장한다.
Assert :
F 는 확장 가능한 객체이며 "prototype" 자신의 프로퍼티를 갖지 않는다.
F .[[Construct]] 를 10.2.2 에서
정의된 것으로 설정한다.
그 외의 경우,
F .[[Construct]] 를 10.3.2 에서
정의된 것으로 설정한다.
F .[[ConstructorKind]] 를 base 로
설정한다.
writablePrototype 이 생략되었으면 writablePrototype 을
true 로 설정한다.
prototype 이 생략되었으면,
prototype 을 OrdinaryObjectCreate (%Object.prototype% )로
설정한다.
! DefinePropertyOrThrow (prototype ,
"constructor" , PropertyDescriptor { [[Value]] : F , [[Writable]] : writablePrototype , [[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
! DefinePropertyOrThrow (F ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] :
writablePrototype , [[Enumerable]] :
false , [[Configurable]] :
false })를 수행한다.
unused 를 반환한다.
10.2.6 MakeClassConstructor ( F )
추상 연산 MakeClassConstructor는 F (ECMAScript 함수 객체 )를 인자로 받아
unused 를 반환한다. 호출 시 다음 단계를 수행한다:
Assert :
F .[[IsClassConstructor]] 가 false 임을
보장한다.
F .[[IsClassConstructor]] 를 true 로
설정한다.
unused 를 반환한다.
10.2.7 MakeMethod ( F , homeObject )
추상 연산 MakeMethod는 F (ECMAScript 함수 객체 )와 homeObject (객체)를 인자로 받아
unused 를 반환한다. 이 연산은 F 를 메서드로 설정한다. 호출 시 다음 단계를 수행한다:
Assert :
homeObject 가 일반 객체 임을 보장한다.
F .[[HomeObject]] 를 homeObject 로 설정한다.
unused 를 반환한다.
10.2.8 DefineMethodProperty ( homeObject , key ,
closure , enumerable )
추상 연산 DefineMethodProperty는 homeObject (객체), key (프로퍼티 키 또는
Private
Name ), closure (함수 객체 ), enumerable
(불리언)을 인자로 받고, 정상 완료 로서 PrivateElement 또는
unused 를 반환하거나, abrupt
completion 을 반환한다. 호출 시 다음 단계를 수행한다:
Assert :
homeObject 는 일반적이고 확장 가능한 객체임을 보장한다.
key 가 Private Name 라면,
PrivateElement
{ [[Key]] : key , [[Kind]] : method , [[Value]] : closure }를 반환한다.
그 외의 경우,
desc 를 PropertyDescriptor { [[Value]] :
closure , [[Writable]] :
true , [[Enumerable]] :
enumerable , [[Configurable]] :
true }로 둔다.
? DefinePropertyOrThrow (homeObject ,
key , desc )를 수행한다.
참고: DefinePropertyOrThrow 는
클래스 정적 메서드의 key 가 "prototype" 일 때만 abrupt
completion 을 반환한다.
unused 를 반환한다.
10.2.9 SetFunctionName ( F , name [ ,
prefix ] )
추상 연산 SetFunctionName은 F (함수 객체 ), name (프로퍼티 키 또는
Private
Name ), 선택적 prefix (문자열)를 인자로 받아 unused 를
반환한다. 이 연산은 F 에 "name" 프로퍼티를 추가한다. 호출 시 다음 단계를 수행한다:
Assert :
F 는 "name" 자신의 프로퍼티가 없는 확장 가능한 객체임을 보장한다.
name 이 심볼 이면,
description 을 name 의 [[Description]] 값으로 둔다.
description 이 undefined 이면 name 을 빈 문자열로
설정한다.
그 외에는 name 을 문자열 연결 로
"[" , description , "]" 을 합친 것으로
설정한다.
그 외에 name 이 Private Name 이면,
name 을 name .[[Description]] 로 설정한다.
F 에 [[InitialName]] 내부 슬롯이 있으면,
F .[[InitialName]] 을 name 으로 설정한다.
prefix 가 있으면,
name 을 문자열 연결 로 prefix ,
코드 유닛 0x0020(SPACE), name 을 합친 것으로 설정한다.
F 에 [[InitialName]] 내부 슬롯이 있으면,
선택적으로 F .[[InitialName]] 을
name 으로 설정한다.
! DefinePropertyOrThrow (F ,
"name" , PropertyDescriptor { [[Value]] :
name , [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
unused 를 반환한다.
10.2.10 SetFunctionLength ( F , length )
추상 연산 SetFunctionLength는 F (함수 객체 ), length (0 이상의 정수 또는 +∞)를 인자로 받아
unused 를 반환한다. 이 연산은 F 에 "length" 프로퍼티를 추가한다.
호출 시 다음 단계를 수행한다:
Assert :
F 는 "length" 자신의 프로퍼티가 없는 확장 가능한 객체임을 보장한다.
! DefinePropertyOrThrow (F ,
"length" , PropertyDescriptor { [[Value]] :
𝔽 (length ),
[[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
unused 를 반환한다.
10.2.11 FunctionDeclarationInstantiation ( func ,
argumentsList )
추상 연산 FunctionDeclarationInstantiation은 func (ECMAScript 함수 객체 ),
argumentsList (ECMAScript 언어 값의
리스트 )를 인자로 받아, unused를 포함하는 정상
완료 또는 throw
completion 을 반환한다. func 는 실행 컨텍스트 가 설정될 함수 객체이다.
참고 1
ECMAScript 함수의 평가를 위해 실행 컨텍스트 가 설정되면 새로운 Function Environment
Record 가 생성되고, 각 형식 매개변수에 대한 바인딩이 해당 Environment Record 에 인스턴스화된다. 함수
본문의 각 선언도 인스턴스화된다. 함수의 형식 매개변수에 기본값 이니셜라이저가 없으면 본문 선언은 매개변수와 같은 Environment Record 에서 인스턴스화된다. 기본값
매개변수 이니셜라이저가 있으면, 본문 선언을 위한 두 번째 Environment Record 가
생성된다. 형식 매개변수와 함수는 FunctionDeclarationInstantiation의 일부로 초기화된다. 그 외의 모든 바인딩은 함수 본문 평가 중에
초기화된다.
호출 시 다음 단계를 수행한다:
calleeContext 를 실행 중인 실행 컨텍스트 로 둔다.
code 를 func .[[ECMAScriptCode]] 로 둔다.
strict 를 func .[[Strict]] 로 둔다.
formals 를 func .[[FormalParameters]] 로 둔다.
parameterNames 를 BoundNames of
formals 로 둔다.
parameterNames 에 중복 항목이 있으면 hasDuplicates 를
true 로, 아니면 false 로 둔다.
simpleParameterList 를 IsSimpleParameterList
of formals 로 둔다.
hasParameterExpressions 를 ContainsExpression
of formals 로 둔다.
varNames 를 VarDeclaredNames of
code 로 둔다.
varDeclarations 를 VarScopedDeclarations
of code 로 둔다.
lexicalNames 를 LexicallyDeclaredNames
of code 로 둔다.
functionNames 를 새로운 빈 List 로 둔다.
functionsToInitialize 를 새로운 빈 List 로 둔다.
varDeclarations 의 각 요소 d 에 대해, List 의 역순으로, 다음을
수행한다:
d 가 VariableDeclaration ,
ForBinding ,
BindingIdentifier 중 어느 것도
아니면,
Assert : d 는 FunctionDeclaration ,
GeneratorDeclaration ,
AsyncFunctionDeclaration ,
AsyncGeneratorDeclaration
중 하나이다.
fn 을 BoundNames
of d 의 유일한 요소로 둔다.
functionNames 에 fn 이 포함되어 있지 않으면,
fn 을 functionNames 의 첫 번째 요소로 삽입한다.
참고: 같은 이름의 함수 선언이 여러 번 있으면 마지막 선언이 사용된다.
d 를 functionsToInitialize 의 첫 번째 요소로 삽입한다.
argumentsObjectNeeded 를 true 로 둔다.
func .[[ThisMode]] 가 lexical 이면,
참고: 화살표 함수는 arguments 객체를 갖지 않는다.
argumentsObjectNeeded 를 false 로 설정한다.
그 외에 parameterNames 에 "arguments" 가 포함되어 있으면,
argumentsObjectNeeded 를 false 로 설정한다.
그 외에 hasParameterExpressions 가 false 이면,
functionNames 에 "arguments" 가 포함되어 있거나
lexicalNames 에 "arguments" 가 포함되어 있으면,
argumentsObjectNeeded 를 false 로 설정한다.
strict 가 true 이거나 hasParameterExpressions 가
false 이면,
참고: 엄격 모드 코드 에서 eval
호출은 외부 바인딩을 볼 수 있는 새로운 바인딩을 만들 수 없으므로 매개변수에 대해 단일 Environment Record 만 필요하다.
env 를 calleeContext 의 LexicalEnvironment로 둔다.
그 외의 경우,
참고: 형식 매개변수 목록에서 직접
eval 호출로 생성된 바인딩이 매개변수가 선언된 환경 외부에 있도록 별도의 Environment Record 가 필요하다.
calleeEnv 를 calleeContext 의 LexicalEnvironment로 둔다.
env 를 NewDeclarativeEnvironment (calleeEnv )로
둔다.
Assert :
calleeContext 의 VariableEnvironment와 calleeEnv 는 같은
Environment Record 이다.
calleeContext 의 LexicalEnvironment를 env 로 설정한다.
parameterNames 의 각 문자열 paramName 에 대해,
alreadyDeclared 를
! env .HasBinding(paramName )으로 둔다.
참고: Early
errors 는 중복 매개변수 이름이 비엄격 함수 에서만 발생하고,
이때 기본값이나 rest 파라미터가 없어야 함을 보장한다.
alreadyDeclared 가 false 이면,
! env .CreateMutableBinding(paramName ,
false )을 수행한다.
hasDuplicates 가 true 이면,
! env .InitializeBinding(paramName ,
undefined )을 수행한다.
argumentsObjectNeeded 가 true 이면,
strict 가 true 이거나 simpleParameterList 가
false 이면,
ao 를 CreateUnmappedArgumentsObject (argumentsList )로
둔다.
그 외의 경우,
참고: rest 파라미터, 기본값 이니셜라이저, 구조 분해 파라미터가 없는 비엄격 함수 에만 mapped
arguments 객체가 제공된다.
ao 를 CreateMappedArgumentsObject (func ,
formals , argumentsList , env )로 둔다.
strict 가 true 이면,
! env .CreateImmutableBinding("arguments" ,
false )을 수행한다.
참고: 엄격 모드 코드 에서는
early errors 가 이 바인딩에 할당을 시도하는
것을 방지하므로, mutability가 관찰되지 않는다.
그 외의 경우,
! env .CreateMutableBinding("arguments" ,
false )을 수행한다.
! env .InitializeBinding("arguments" ,
ao )를 수행한다.
parameterBindings 를 list-concatenation of
parameterNames 및 « "arguments" »로 둔다.
그 외의 경우,
parameterBindings 를 parameterNames 로 둔다.
iteratorRecord 를 CreateListIteratorRecord (argumentsList )로
둔다.
hasDuplicates 가 true 이면,
usedEnv 를 undefined 로 둔다.
그 외의 경우,
usedEnv 를 env 로 둔다.
참고: 다음 단계는 ReturnCompletion 을 반환할 수 없다. 왜냐하면 식
위치에서 그런 완료가 발생할 수 있는 유일한 방법은 YieldExpression 을 사용하는 것인데, 이는
15.5.1
및 15.6.1 의
Early Error 규칙에 의해 파라미터 리스트에서 금지되어 있기 때문이다.
? IteratorBindingInitialization of
formals with arguments iteratorRecord 및 usedEnv 를 수행한다.
hasParameterExpressions 가 false 이면,
참고: 매개변수와 top-level var를 위해 단일 Environment
Record 만 필요하다.
instantiatedVarNames 를 parameterBindings 의 복사본으로 둔다.
varNames 의 각 요소 n 에 대해,
instantiatedVarNames 에 n 이 없으면,
n 을 instantiatedVarNames 에 추가한다.
! env .CreateMutableBinding(n ,
false )을 수행한다.
! env .InitializeBinding(n ,
undefined )을 수행한다.
varEnv 를 env 로 둔다.
그 외의 경우,
참고: 형식 매개변수 리스트 내 식에서 생성된 클로저가 함수 본문 내 선언을 볼 수 없도록 별도의 Environment Record 가 필요하다.
varEnv 를 NewDeclarativeEnvironment (env )로
둔다.
calleeContext 의 VariableEnvironment를 varEnv 로 설정한다.
instantiatedVarNames 를 새로운 빈 List 로 둔다.
varNames 의 각 요소 n 에 대해,
instantiatedVarNames 에 n 이 없으면,
n 을 instantiatedVarNames 에 추가한다.
! varEnv .CreateMutableBinding(n ,
false )을 수행한다.
parameterBindings 에 n 이 없거나
functionNames 에 n 이 있으면,
initialValue 를 undefined 로
둔다.
그 외의 경우,
initialValue 를
! env .GetBindingValue(n ,
false )로 둔다.
! varEnv .InitializeBinding(n ,
initialValue )를 수행한다.
참고: 형식 매개변수와 같은 이름의 var는 해당 초기화된 파라미터와 같은 값을 처음 가진다.
참고: 부록 B.3.2.1 은
이 위치에 추가 단계를 둔다.
strict 가 false 이면,
lexEnv 를 NewDeclarativeEnvironment (varEnv )로
둔다.
참고: 비엄격 함수 는 top-level lexical 선언을
위해 별도의 Environment Record 를 사용하며,
이는 직접
eval 이 eval 코드로 도입한 var 범위 선언이 기존 top-level lexical 선언과
충돌하는지 판단할 수 있도록 한다. 엄격 함수 에는 필요하지 않다. 엄격 직접
eval 은 항상 모든 선언을 새로운 Environment Record 에
위치시킨다.
그 외의 경우,
lexEnv 를 varEnv 로 둔다.
calleeContext 의 LexicalEnvironment를 lexEnv 로 설정한다.
lexDeclarations 를 LexicallyScopedDeclarations
of code 로 둔다.
lexDeclarations 의 각 요소 d 에 대해,
참고: lexical 선언된 이름은 함수/제너레이터 선언, 형식 매개변수, var 이름과 같을 수 없다. lexical 선언된 이름은 여기서
인스턴스화만 되고 초기화되지 않는다.
BoundNames of
d 의 각 요소 dn 에 대해,
IsConstantDeclaration
of d 가 true 이면,
! lexEnv .CreateImmutableBinding(dn ,
true )를 수행한다.
그 외의 경우,
! lexEnv .CreateMutableBinding(dn ,
false )를 수행한다.
privateEnv 를 calleeContext 의 PrivateEnvironment로 둔다.
functionsToInitialize 의 각 파스 노드 f 에
대해,
fn 을 BoundNames of
f 의 유일한 요소로 둔다.
fo 를 InstantiateFunctionObject
of f with arguments lexEnv 및 privateEnv 로 둔다.
! varEnv .SetMutableBinding(fn , fo ,
false )를 수행한다.
unused 를 반환한다.
참고 2
B.3.2
는 ECMAScript 2015 이전의 웹 브라우저 구현과의 하위 호환성을 위해 위 알고리즘에 대한 확장을 제공한다.
10.3 내장 함수 객체
내장 함수 객체 는
일반 객체 이며,
일반 객체 에 대한
10.1 의 요구사항을
반드시 만족해야 합니다.
모든 일반 객체 에
요구되는 내부 슬롯(자세한 내용은 10.1 참고) 외에,
내장 함수 객체 는
다음 내부 슬롯도 반드시 가져야 합니다:
내장 함수 객체 의
[[Prototype]] 내부 슬롯의 초기값은 별도의 명시가 없는 한 %Function.prototype% 입니다.
내장 함수 객체 는
10.3.1 에
정의된 [[Call]] 내부 메서드를 반드시 가져야 합니다.
내장 함수 객체 는
“생성자 ”로 기술되어 있거나,
이 명세의 어떤 알고리즘이 명시적으로 [[Construct]] 내부 메서드를 설정한 경우에만 [[Construct]] 내부 메서드를 가집니다. 이러한 [[Construct]] 내부
메서드는 반드시 10.3.2 에
정의된 내용을 따라야 합니다.
구현체는 이 명세에 정의되지 않은 추가적인 내장 함수 객체 를 제공할 수 있습니다.
10.3.1 [[Call]] ( thisArgument ,
argumentsList )
내장 함수
객체 F 의 [[Call]] 내부 메서드는
thisArgument (ECMAScript 언어 값 ),
argumentsList (ECMAScript 언어 값의
리스트 )를 인자로 받아, ECMAScript 언어 값 를 포함하는
정상 완료 또는 throw completion 을 반환한다.
호출 시 다음 단계를 수행한다:
? BuiltinCallOrConstruct (F ,
thisArgument , argumentsList , undefined )를 반환한다.
10.3.2 [[Construct]] (
argumentsList , newTarget )
내장 함수
객체 F 의 [[Construct]] 내부 메서드(존재하는 경우)는
argumentsList (ECMAScript 언어 값의
리스트 ), newTarget (생성자 )를 인자로 받아, 객체를 포함하는 정상 완료 또는 throw completion 을 반환한다.
호출 시 다음 단계를 수행한다:
result 를 ? BuiltinCallOrConstruct (F ,
uninitialized , argumentsList , newTarget )로
둔다.
Assert :
result 가 객체 임을 보장한다.
result 를 반환한다.
10.3.3 BuiltinCallOrConstruct ( F ,
thisArgument , argumentsList , newTarget )
BuiltinCallOrConstruct 추상 연산은 F (내장 함수 객체 ), thisArgument
(ECMAScript 언어 값 또는
uninitialized ), argumentsList (ECMAScript 언어 값의 리스트 ),
newTarget (생성자 또는 undefined )를 인자로 받아,
ECMAScript 언어 값 를 포함하는 정상 완료 또는 throw completion 을 반환한다.
호출 시 다음 단계를 수행한다:
callerContext 를 실행 중인 실행 컨텍스트 로 둔다.
callerContext 가 이미 일시정지(suspended) 상태가 아니면, callerContext 를 일시정지시킨다.
calleeContext 를 새로운 실행 컨텍스트 로 둔다.
calleeContext 의 Function을 F 로 설정한다.
calleeRealm 을 F .[[Realm]] 로 둔다.
calleeContext 의 Realm 을 calleeRealm 으로 설정한다.
calleeContext 의 ScriptOrModule을 null 로 설정한다.
calleeContext 의 구현체 정의 초기화(implementation-defined initialization)를 수행한다.
calleeContext 를 실행 컨텍스트 스택 에 푸시한다;
calleeContext 는 이제 실행 중인 실행 컨텍스트 이다.
result 를 Completion
Record 로, F 를 이 명세에 정의된 대로 평가한
결과 로 둔다. thisArgument 가 uninitialized 이면
this 값은 미초기화 상태이고, 아니면 thisArgument 가
this 값을 제공한다. argumentsList 는 명명된 파라미터를 제공하며,
newTarget 은 NewTarget 값을 제공한다.
참고: F 가 이 문서에서 정의된 경우, “the specification of F ”는 알고리즘 단계 또는 그 외
수단으로 명세된 동작이다.
calleeContext 를 실행 컨텍스트 스택 에서 제거하고,
callerContext 를 실행 중인 실행 컨텍스트 로 복원한다.
? result 를 반환한다.
참고
calleeContext 가 실행 컨텍스트 스택 에서 제거될 때, 접근 가능한
Generator에 의해 나중에 재개(resume)될 수 있도록 일시정지(suspend) 상태라면 파괴되어서는 안 됩니다.
10.3.4 CreateBuiltinFunction ( behaviour ,
length , name , additionalInternalSlotsList [ , realm
[ , prototype [ , prefix ] ] ] )
CreateBuiltinFunction 추상 연산은 behaviour (Abstract Closure , 알고리즘 단계 집합,
또는 명세 내에서 함수 동작을 정의한 기타 수단), length (0 이상의 정수 또는 +∞), name (프로퍼티 키 또는
Private
Name ), additionalInternalSlotsList (내부 슬롯 이름 리스트 ), 그리고 선택적
realm (Realm
Record ), prototype (객체 또는 null ),
prefix (문자열)을 인자로 받아 내장 함수 객체 를 반환한다.
additionalInternalSlotsList 에는 객체의 일부로 정의되어야 하는 추가 내부 슬롯 이름이 포함된다. 이 연산은 내장 함수 객체 를
생성한다. 호출 시 다음 단계를 수행한다:
realm 이 없으면 realm 을 현재 Realm Record 로 설정한다.
prototype 이 없으면 prototype 을 realm .[[Intrinsics]] .[[%Function.prototype% ]]로
설정한다.
internalSlotsList 를, 생성할 내장 함수 객체 에 대해 10.3 이 요구하는 모든 내부 슬롯의 이름을
포함하는 List 로 둔다.
internalSlotsList 끝에 additionalInternalSlotsList 의 모든 요소를 추가한다.
func 를, 호출 시 behaviour 에서 명시된 대로 해당 인자를 파라미터 값으로 사용하여 행동하는 새로운 내장
함수
객체 로 둔다. 새 함수 객체 는 internalSlotsList 의 이름을
가진 내부 슬롯들과, [[InitialName]] 내부 슬롯을 가진다.
func .[[Prototype]] 을 prototype 으로 설정한다.
func .[[Extensible]] 을 true 로 설정한다.
func .[[Realm]] 을 realm 으로 설정한다.
func .[[InitialName]] 을 null 로 설정한다.
SetFunctionLength (func ,
length )를 수행한다.
prefix 가 없으면,
SetFunctionName (func ,
name )을 수행한다.
그 외의 경우,
SetFunctionName (func ,
name , prefix )를 수행한다.
func 를 반환한다.
이 명세에 정의된 모든 내장 함수는 CreateBuiltinFunction 추상 연산을 호출하여 생성된다.
10.4 내장 익조틱(Exotic) 객체의 내부 메서드와 슬롯
이 명세는 여러 종류의 내장 익조틱
객체 를 정의합니다. 이러한 객체들은 몇몇 특정 상황을 제외하면 일반적으로 일반 객체 와 비슷하게 동작합니다. 아래의 익조틱 객체 들은 별도로 명시된
경우를 제외하고는 일반
객체 의 내부 메서드를 사용합니다:
10.4.1 바운드 함수 익조틱 객체
바운드 함수 익조틱 객체 는 또 다른 함수 객체 를 감싸는
익조틱
객체 입니다. 바운드 함수 익조틱 객체 는 호출 가능하며([[Call]] 내부 메서드를 가지고 있을 수 있고, [[Construct]] 내부
메서드도 가질 수 있습니다), 이를 호출하면 일반적으로 감싸고 있는 함수가 호출됩니다.
객체가 [[Call]] 및 (해당되는 경우) [[Construct]] 내부 메서드가
아래 구현을 따르고, 그 외의 필수 내부 메서드는 10.1 의 정의를
따른다면, 그 객체는 바운드 함수 익조틱 객체 입니다. 이러한 메서드는 BoundFunctionCreate 에서
설치됩니다.
바운드 함수 익조틱 객체 는 표 30 에 나열된
ECMAScript 함수
객체 의 내부 슬롯을 가지지 않습니다. 대신, [[Prototype]] 및 [[Extensible]] 와 더불어 표 31 에 나열된
내부 슬롯을 가집니다.
표 31: 바운드 함수 익조틱 객체의 내부 슬롯
내부 슬롯
타입
설명
[[BoundTargetFunction]]
호출 가능한 객체
감싸고 있는 함수 객체 .
[[BoundThis]]
ECMAScript 언어 값
감싸고 있는 함수를 호출할 때 항상 this 값으로 전달되는 값입니다.
[[BoundArguments]]
리스트
(ECMAScript 언어
값 의 리스트)
감싸고 있는 함수를 호출할 때 항상 첫 번째 인수로 전달되는 값들의 리스트입니다.
10.4.1.1 [[Call]] (
thisArgument , argumentsList )
바운드 함수 익조틱 객체 F 의 [[Call]] 내부 메서드는 thisArgument (ECMAScript 언어 값 ),
argumentsList (ECMAScript 언어 값
리스트 )를 인자로 받아, ECMAScript 언어 값 를
포함하는 정상 완료 또는 throw completion 을
반환한다. 호출 시 다음 단계를 수행한다:
target 를 F .[[BoundTargetFunction]] 으로
둔다.
boundThis 를 F .[[BoundThis]] 로 둔다.
boundArgs 를 F .[[BoundArguments]] 로 둔다.
args 를 리스트 연결 (boundArgs ,
argumentsList )로 둔다.
? Call (target ,
boundThis , args )를 반환한다.
10.4.1.2 [[Construct]] (
argumentsList , newTarget )
바운드 함수 익조틱 객체 F 의 [[Construct]] 내부 메서드는 argumentsList (ECMAScript 언어 값 리스트 ),
newTarget (생성자 )를 인자로 받아, 객체를 포함하는 정상 완료 또는 throw completion 을
반환한다. 호출 시 다음 단계를 수행한다:
target 를 F .[[BoundTargetFunction]] 으로
둔다.
Assert :
IsConstructor (target )가
true 임을 보장한다.
boundArgs 를 F .[[BoundArguments]] 로 둔다.
args 를 리스트 연결 (boundArgs ,
argumentsList )로 둔다.
SameValue (F ,
newTarget )가 true 이면, newTarget 를
target 으로 설정한다.
? Construct (target ,
args , newTarget )를 반환한다.
10.4.1.3 BoundFunctionCreate ( targetFunction ,
boundThis , boundArgs )
BoundFunctionCreate 추상 연산은 targetFunction (함수 객체 ), boundThis
(ECMAScript 언어 값 ),
boundArgs (ECMAScript 언어 값
리스트 )를 인자로 받아, 함수 객체 를 포함하는 정상 완료 또는 throw completion 을
반환한다. 이 연산은 새로운 바운드 함수 익조틱 객체 의 생성을 명세하는 데 사용된다.
호출 시 다음 단계를 수행한다:
proto 를 ? targetFunction .[[GetPrototypeOf]] ()로 둔다.
internalSlotsList 를 리스트 연결 로 « [[Prototype]] , [[Extensible]] »와 표
31 에 나열된 내부 슬롯들을 합친 것으로 둔다.
obj 를 MakeBasicObject (internalSlotsList )로
둔다.
obj .[[Prototype]] 을 proto 로 설정한다.
obj .[[Call]] 을 10.4.1.1 에서
설명한 대로 설정한다.
IsConstructor (targetFunction )
가 true 이면,
obj .[[Construct]] 를 10.4.1.2 에서
설명한 대로 설정한다.
obj .[[BoundTargetFunction]] 을
targetFunction 으로 설정한다.
obj .[[BoundThis]] 를 boundThis 로 설정한다.
obj .[[BoundArguments]] 를 boundArgs 로
설정한다.
obj 를 반환한다.
10.4.2 배열 익조틱 객체
배열(Array)은 익조틱
객체 로, 배열 인덱스 프로퍼티 키 에 대해 특별한 처리를 합니다(자세한 내용은
6.1.7
참고). 프로퍼티
이름 이 배열 인덱스 인 프로퍼티는 요소(element) 라고도 부릅니다. 모든 배열은 항상
0 이상의 정수(Number) 값을 가지며, 그 수학적
값 이 232 미만인, 변경 불가능(non-configurable)한
"length" 프로퍼티를 가집니다. "length" 프로퍼티의 값은 그 이름이 배열 인덱스 인 모든 자신의 프로퍼티
이름보다 숫자적으로 큽니다. 배열의 자신의 프로퍼티가 생성되거나 변경될 때마다 이 불변식(invariant)을 유지하기 위해 다른 프로퍼티들도 필요에 따라 조정됩니다.
구체적으로, 이름이 배열
인덱스 인 자신의 프로퍼티가 추가되면, 필요하다면 "length" 프로퍼티의 값을 해당
배열 인덱스 의 수치값 +
1로 변경합니다. 그리고 "length" 의 값이 변경될 때마다, 그 값 이상인 모든 배열 인덱스 이름을 가진 자신의 프로퍼티를 삭제합니다. 이 제약은
배열의 자신의 프로퍼티에만 적용되며, "length" 나 배열 인덱스 프로퍼티가 프로토타입에서 상속된 경우에는 영향을 미치지
않습니다.
객체의 [[DefineOwnProperty]] 내부 메서드가 아래 구현을 따르고, 그 외의 필수 내부 메서드가 10.1 의 정의를
따른다면, 그 객체는 배열 익조틱
객체 (또는 간단히 배열)입니다. 이러한 메서드는 ArrayCreate 에서 설치됩니다.
10.4.2.1 [[DefineOwnProperty]] (
P , Desc )
배열 익조틱
객체 A 의 [[DefineOwnProperty]] 내부
메서드는 P (프로퍼티 키 ), Desc (프로퍼티 디스크립터 )를 인자로
받고, 불리언을 포함하는 정상 완료 또는 throw completion 을
반환합니다. 호출 시 다음 단계를 수행합니다:
P 가 "length" 이면,
? ArraySetLength (A ,
Desc )를 반환합니다.
그 외에 P 가 배열 인덱스 이면,
lengthDesc 를 OrdinaryGetOwnProperty (A ,
"length" )로 둔다.
Assert :
lengthDesc 가 undefined 가 아님을 보장합니다.
Assert :
IsDataDescriptor (lengthDesc )가
true 임을 보장합니다.
Assert :
lengthDesc .[[Configurable]] 가
false 임을 보장합니다.
length 를 lengthDesc .[[Value]] 로
둔다.
Assert :
length 가 0 이상의 정수(Number) 임을 보장합니다.
index 를 ! ToUint32 (P )로 둡니다.
index ≥ length 이고 lengthDesc .[[Writable]] 이 false 이면,
false 를 반환합니다.
succeeded 를 ! OrdinaryDefineOwnProperty (A ,
P , Desc )로 둡니다.
succeeded 가 false 이면, false 를
반환합니다.
index ≥ length 이면,
lengthDesc .[[Value]] 를
index + 1 𝔽 로 설정합니다.
succeeded 를 ! OrdinaryDefineOwnProperty (A ,
"length" , lengthDesc )로 둡니다.
Assert : succeeded 가
true 임을 보장합니다.
true 를 반환합니다.
? OrdinaryDefineOwnProperty (A ,
P , Desc )를 반환합니다.
10.4.2.2 ArrayCreate ( length [ , proto ]
)
ArrayCreate 추상 연산은 length (0 이상의 정수 ), 선택적 proto (객체)를 인자로 받아, 배열 익조틱
객체 를 포함하는 정상 완료
또는 throw completion 을
반환합니다. 이는 새로운 배열 생성 시 사용됩니다. 호출 시 다음 단계를 수행합니다:
length > 232 - 1이면 RangeError 예외를 던집니다.
proto 가 없으면 proto 를 %Array.prototype% 로
설정합니다.
A 를 MakeBasicObject (« [[Prototype]] , [[Extensible]] »)로 둡니다.
A .[[Prototype]] 을 proto 로 설정합니다.
A .[[DefineOwnProperty]] 를 10.4.2.1 에
명시된 대로 설정합니다.
! OrdinaryDefineOwnProperty (A ,
"length" , PropertyDescriptor { [[Value]] :
𝔽 (length ),
[[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false })를 수행합니다.
A 를 반환합니다.
10.4.2.3 ArraySpeciesCreate ( originalArray ,
length )
ArraySpeciesCreate 추상 연산은 originalArray (객체), length (0 이상의 정수 )를 인자로 받아, 객체를 포함하는
정상 완료 또는 throw completion 을
반환합니다. 이는 originalArray 에서 파생된 생성자 함수를 사용해 새로운 배열 또는 유사 객체를 생성할 때 사용됩니다. 여기서
생성자 함수가
반드시 Array를 반환할 필요는 없습니다. 호출 시 다음 단계를 수행합니다:
isArray 를 ? IsArray (originalArray )로 둡니다.
isArray 가 false 이면 ? ArrayCreate (length )를
반환합니다.
C 를 ? Get (originalArray ,
"constructor" )로 둡니다.
IsConstructor (C )가
true 이면,
thisRealm 을 현재 Realm Record 로 둡니다.
realmC 를 ? GetFunctionRealm (C )로
둡니다.
thisRealm 과 realmC 가 동일한 Realm Record 가 아니면,
SameValue (C ,
realmC .[[Intrinsics]] .[[%Array% ]])가
true 이면 C 를
undefined 로 둡니다.
C 가 객체 이면,
C 를 ? Get (C ,
%Symbol.species% )로
둡니다.
C 가 null 이면 C 를
undefined 로 둡니다.
C 가 undefined 이면 ? ArrayCreate (length )를
반환합니다.
IsConstructor (C )가
false 이면 TypeError 예외를 던집니다.
? Construct (C , « 𝔽 (length ) »)를 반환합니다.
참고
originalArray 가 realm 이 실행 중인 실행 컨텍스트 의 realm 와 다를 때, 표준 내장
Array 생성자 로 생성된 경우에는 실행 중인 실행 컨텍스트 의 realm 에서 새로운 배열이
생성됩니다. 이는 ArraySpeciesCreate를 사용하는 Array.prototype 메서드가 역사적으로 웹 브라우저에서
이런 동작을 보였던 것과의 호환성을 유지하기 위한 것입니다.
10.4.2.4 ArraySetLength ( A , Desc )
ArraySetLength 추상 연산은 A (배열), Desc (프로퍼티 디스크립터 )를 인자로
받아, 불리언을 포함하는 정상 완료 또는 throw completion 을
반환합니다. 호출 시 다음 단계를 수행합니다:
Desc 에 [[Value]] 필드가 없으면,
! OrdinaryDefineOwnProperty (A ,
"length" , Desc )를 반환합니다.
newLenDesc 를 Desc 의 복사본으로 둔다.
newLen 를 ? ToUint32 (Desc .[[Value]] )로 둔다.
numberLen 를 ? ToNumber (Desc .[[Value]] )로 둔다.
SameValueZero (newLen ,
numberLen )이 false 이면 RangeError 예외를
던집니다.
newLenDesc .[[Value]] 를 newLen 로 설정합니다.
oldLenDesc 를 OrdinaryGetOwnProperty (A ,
"length" )로 둡니다.
Assert :
oldLenDesc 가 undefined 가 아님을 보장합니다.
Assert :
IsDataDescriptor (oldLenDesc )가
true 임을 보장합니다.
Assert :
oldLenDesc .[[Configurable]] 가
false 임을 보장합니다.
oldLen 을 oldLenDesc .[[Value]] 로 둡니다.
newLen ≥ oldLen 이면,
! OrdinaryDefineOwnProperty (A ,
"length" , newLenDesc )를 반환합니다.
oldLenDesc .[[Writable]] 이
false 이면, false 를 반환합니다.
newLenDesc 에 [[Writable]] 필드가 없거나
newLenDesc .[[Writable]] 이
true 이면,
newWritable 을 true 로 둡니다.
그 외의 경우,
참고: [[Writable]] 속성을 false 로 설정하는
것은 요소 삭제에 실패하는 경우를 대비해 미룹니다.
newWritable 을 false 로 둡니다.
newLenDesc .[[Writable]] 을
true 로 설정합니다.
succeeded 를 ! OrdinaryDefineOwnProperty (A ,
"length" , newLenDesc )로 둡니다.
succeeded 가 false 이면, false 를 반환합니다.
자신의 프로퍼티
키 P 중, P 가 배열 인덱스 이고, ! ToUint32 (P ) ≥
newLen 인 모든 P 에 대해, 내림차순 숫자 인덱스 순으로,
deleteSucceeded 를 ! A .[[Delete]] (P )로 둡니다.
deleteSucceeded 가 false 이면,
newLenDesc .[[Value]] 를
! ToUint32 (P ) +
1 𝔽 로 설정합니다.
newWritable 이 false 이면,
newLenDesc .[[Writable]] 을
false 로 설정합니다.
! OrdinaryDefineOwnProperty (A ,
"length" , newLenDesc )를 수행합니다.
false 를 반환합니다.
newWritable 이 false 이면,
succeeded 를 ! OrdinaryDefineOwnProperty (A ,
"length" , PropertyDescriptor { [[Writable]] : false })로 둡니다.
Assert :
succeeded 가 true 임을 보장합니다.
true 를 반환합니다.
참고
3 및 4 단계에서
Desc .[[Value]] 가 객체인 경우 valueOf 메서드가
두 번 호출됩니다. 이는 2판(Edition 2) 명세에서 이 효과를 명시한 이후로 유지되고 있는 레거시 동작입니다.
10.4.3 문자열 익조틱 객체
String 객체는 문자열 값을 캡슐화하고, 해당 문자열 값의 각 코드 유닛 요소에 대응하는 가상 정수 인덱스 데이터 프로퍼티 를
노출하는 익조틱
객체 입니다. 문자열 익조틱 객체 는 항상 캡슐화된 문자열 값의 길이를 값으로 갖는
"length" 라는 이름의 데이터 프로퍼티 를 가집니다. 코드 유닛 데이터 프로퍼티 와
"length" 프로퍼티 모두 쓰기 불가 및 재정의 불가(non-configurable)입니다.
객체의 [[GetOwnProperty]] , [[DefineOwnProperty]] ,
[[OwnPropertyKeys]] 내부 메서드가 아래 구현을 따르고, 그 외의 필수 내부 메서드는 10.1 의 정의를
따른다면, 그 객체는 문자열
익조틱 객체 (혹은 간단히 String 객체)입니다. 이 메서드들은 StringCreate 에서 설치됩니다.
문자열 익조틱
객체 는 일반 객체 와 동일한 내부 슬롯을 가지며, 추가로 [[StringData]] 내부 슬롯을 가집니다.
10.4.3.1 [[GetOwnProperty]] (
P )
문자열 익조틱
객체 S 의 [[GetOwnProperty]] 내부 메서드는
P (프로퍼티
키 )를 인자로 받아, 프로퍼티 디스크립터 또는
undefined 를 포함하는 정상 완료 를 반환합니다. 호출 시
다음 단계를 수행합니다:
desc 를 OrdinaryGetOwnProperty (S ,
P )로 둡니다.
desc 가 undefined 가 아니면 desc 를 반환합니다.
StringGetOwnProperty (S ,
P )를 반환합니다.
10.4.3.2 [[DefineOwnProperty]] (
P , Desc )
문자열 익조틱
객체 S 의 [[DefineOwnProperty]] 내부
메서드는 P (프로퍼티 키 ), Desc (프로퍼티 디스크립터 )를 인자로
받아, 불리언을 포함하는 정상 완료 를 반환합니다. 호출 시
다음 단계를 수행합니다:
stringDesc 를 StringGetOwnProperty (S ,
P )로 둡니다.
stringDesc 가 undefined 가 아니면,
extensible 을 S .[[Extensible]] 로
둔다.
IsCompatiblePropertyDescriptor (extensible ,
Desc , stringDesc )를 반환한다.
! OrdinaryDefineOwnProperty (S ,
P , Desc )를 반환한다.
10.4.3.3 [[OwnPropertyKeys]] ( )
문자열 익조틱
객체 O 의 [[OwnPropertyKeys]] 내부 메서드는
인자를 받지 않으며, 프로퍼티
키 의 리스트 를
포함하는 정상 완료 를 반환합니다. 호출 시
다음 단계를 수행합니다:
keys 를 새로운 빈 리스트 로 둔다.
str 을 O .[[StringData]] 로 둔다.
Assert :
str 이 문자열 임을 보장한다.
len 을 str 의 길이로 둔다.
0 ≤ i < len 인 모든 정수 i 에 대해 오름차순으로,
! ToString (𝔽 (i ))를
keys 에 추가한다.
자신의 프로퍼티
키 P 중, P 가 배열 인덱스 이고, ! ToIntegerOrInfinity (P )
≥ len 인 모든 P 에 대해 오름차순 숫자 인덱스 순서대로,
P 를 keys 에 추가한다.
자신의 프로퍼티
키 P 중, P 가 문자열 이고
배열
인덱스 가 아닌 모든 P 에 대해 프로퍼티 생성 시점의 오름차순 순서대로,
P 를 keys 에 추가한다.
자신의 프로퍼티
키 P 중, P 가 심볼 인 모든
P 에 대해 프로퍼티 생성 시점의 오름차순 순서대로,
P 를 keys 에 추가한다.
keys 를 반환한다.
10.4.3.4 StringCreate ( value , prototype )
StringCreate 추상 연산은 value (문자열), prototype (객체)를 인자로 받아 문자열 익조틱
객체 를 반환한다. 이는 새로운 문자열 익조틱 객체 의 생성을 명세하는 데
사용된다. 호출 시 다음 단계를 수행한다:
S 를 MakeBasicObject (« [[Prototype]] , [[Extensible]] , [[StringData]] »)로 둔다.
S .[[Prototype]] 을 prototype 으로 설정한다.
S .[[StringData]] 를 value 로 설정한다.
S .[[GetOwnProperty]] 를 10.4.3.1 에
명시된 대로 설정한다.
S .[[DefineOwnProperty]] 를 10.4.3.2 에
명시된 대로 설정한다.
S .[[OwnPropertyKeys]] 를 10.4.3.3 에
명시된 대로 설정한다.
length 를 value 의 길이로 둔다.
! DefinePropertyOrThrow (S ,
"length" , PropertyDescriptor { [[Value]] :
𝔽 (length ),
[[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
S 를 반환한다.
10.4.3.5 StringGetOwnProperty ( S , P )
StringGetOwnProperty 추상 연산은 S ([[StringData]] 내부 슬롯이 있는
객체), P (프로퍼티 키 )를 인자로 받아, 프로퍼티 디스크립터 또는
undefined 를 반환한다. 호출 시 다음 단계를 수행한다:
P 가 문자열 이 아니면
undefined 를 반환한다.
index 를 CanonicalNumericIndexString (P )로
둔다.
index 가 정수(Number) 가 아니면
undefined 를 반환한다.
index 가 -0 𝔽 이거나 index <
-0 𝔽 이면 undefined 를 반환한다.
str 을 S .[[StringData]] 로 둔다.
Assert :
str 이 문자열 임을 보장한다.
len 을 str 의 길이로 둔다.
ℝ (index ) ≥
len 이면 undefined 를 반환한다.
resultStr 를 substring (str , ℝ (index ),
ℝ (index ) +
1)로 둔다.
PropertyDescriptor { [[Value]] : resultStr , [[Writable]] : false , [[Enumerable]] : true , [[Configurable]] : false }를 반환한다.
10.4.4 Arguments 익조틱 객체
대부분의 ECMAScript 함수는 arguments 객체를 코드에서 사용할 수 있도록 제공합니다. 함수 정의의 특성에 따라, arguments 객체는 일반 객체 이거나
arguments 익조틱 객체 입니다. arguments
익조틱 객체 는 익조틱 객체 로, 배열 인덱스 프로퍼티가 관련 ECMAScript 함수의 호출 시 형식
매개변수 바인딩과 매핑됩니다.
객체의 내부 메서드가 아래 구현을 따르고, 여기 명시되지 않은 메서드는 10.1 의 정의를
따른다면, 그 객체는 arguments 익조틱 객체 입니다. 이러한 메서드는 CreateMappedArgumentsObject 에서
설치됩니다.
참고 1
Arguments 익조틱 객체 는 일반 객체 와 동일한
내부 슬롯을 가지고 있습니다. 또한 [[ParameterMap]] 내부 슬롯을 가집니다. 일반 arguments 객체도 [[ParameterMap]] 내부 슬롯을 가지지만, 그 값은 항상 undefined 입니다.
일반 arguments 객체에서 [[ParameterMap]] 내부 슬롯은
Object.prototype.toString (20.1.3.6 )에서 해당 객체임을
식별하는 데만 사용됩니다.
참고 2
arguments 익조틱 객체 의 정수 인덱스
데이터
프로퍼티 중 이름이 해당 함수 객체 의 형식 매개변수 개수보다 작은 것은 처음에 함수
실행 컨텍스트 의 인수 바인딩과 값을 공유합니다. 즉,
프로퍼티를 변경하면 인수 바인딩의 값도 바뀌고 그 반대도 마찬가지입니다. 이 대응은 해당 프로퍼티를 삭제 후 재정의하거나 접근자 프로퍼티로 바꾸면 끊어집니다.
arguments 객체가 일반 객체 라면, 프로퍼티의 값은 함수에 전달된 인수의 복사본일 뿐이며,
프로퍼티 값과 형식 매개변수 값 사이에 동적 연결은 없습니다.
참고 3
ParameterMap 객체와 그 프로퍼티 값은 arguments 객체와 인수 바인딩의 대응을 명세하기 위한 장치로 사용됩니다. ParameterMap 객체와
그 프로퍼티 값 객체는 ECMAScript 코드에서 직접 관찰할 수 없습니다. 명세된 의미론을 구현하기 위해, ECMAScript 구현체는 실제로 이러한
객체를 생성하거나 사용할 필요가 없습니다.
참고 4
일반 arguments 객체는 접근 시 TypeError 예외를 던지는 "callee" 라는
이름의 변경 불가 접근자 프로퍼티 를 정의합니다. arguments 익조틱 객체 는
"callee" 프로퍼티에 대해 좀 더 구체적인 의미를 가지며, 이는 일부 비엄격
함수 에 대해서만 생성됩니다. 일반 variant에서 이 프로퍼티를 정의하는 것은, ECMAScript 구현체가 이와
다른 방법으로 프로퍼티를 정의하지 않도록 보장하기 위함입니다.
참고 5
ECMAScript의 arguments 익조틱 객체 구현체는 역사적으로
"caller" 라는 접근자 프로퍼티를 포함하는 경우가 있었습니다. ECMAScript 2017 이전에는 이 명세서에 일반
arguments 객체에 대해 예외를 던지는 "caller" 프로퍼티 정의가 포함되어 있었습니다. 현재는 구현체가 더 이상
이 확장을 포함하지 않으므로, ECMAScript 2017에서 이 요구사항을 삭제하였습니다.
10.4.4.1 [[GetOwnProperty]] (
P )
arguments 익조틱 객체
args 의 [[GetOwnProperty]] 내부 메서드는 P (프로퍼티 키 )를 인자로
받아, 프로퍼티 디스크립터 또는
undefined 를 포함하는 정상 완료 를 반환합니다. 호출 시
다음 단계를 수행합니다:
desc 를 OrdinaryGetOwnProperty (args ,
P )로 둔다.
desc 가 undefined 이면 undefined 를 반환한다.
map 을 args .[[ParameterMap]] 로 둔다.
isMapped 를 ! HasOwnProperty (map ,
P )로 둔다.
isMapped 가 true 이면,
desc .[[Value]] 를 ! Get (map ,
P )로 설정한다.
desc 를 반환한다.
10.4.4.2 [[DefineOwnProperty]] (
P , Desc )
arguments 익조틱 객체
args 의 [[DefineOwnProperty]] 내부 메서드는 P
(프로퍼티
키 ), Desc (프로퍼티 디스크립터 )를 인자로
받아 불리언을 포함하는 정상 완료 를 반환합니다. 호출 시
다음 단계를 수행합니다:
map 을 args .[[ParameterMap]] 로 둔다.
isMapped 를 ! HasOwnProperty (map ,
P )로 둔다.
newArgDesc 를 Desc 로 둔다.
isMapped 가 true 이고 IsDataDescriptor (Desc )
가 true 이면,
Desc 에 [[Value]] 필드가 없고, Desc 에
[[Writable]] 필드가 있으면서 Desc .[[Writable]] 이 false 이면,
newArgDesc 를 Desc 의 복사본으로 둔다.
newArgDesc .[[Value]] 를
! Get (map ,
P )로 설정한다.
allowed 를 ! OrdinaryDefineOwnProperty (args ,
P , newArgDesc )로 둔다.
allowed 가 false 이면 false 를 반환한다.
isMapped 가 true 이면,
IsAccessorDescriptor (Desc )
가 true 이면,
! map .[[Delete]] (P )를 수행한다.
그 외의 경우,
Desc 에 [[Value]] 필드가 있으면,
Assert : 아래 Set은 반드시
성공한다. arguments 객체에 의해 매핑되는 형식 매개변수는 항상 writable이다.
! Set (map ,
P , Desc .[[Value]] ,
false )를 수행한다.
Desc 에 [[Writable]] 필드가 있고
Desc .[[Writable]] 이
false 이면,
! map .[[Delete]] (P )를 수행한다.
true 를 반환한다.
10.4.4.3 [[Get]] ( P ,
Receiver )
arguments 익조틱 객체
args 의 [[Get]] 내부 메서드는 P (프로퍼티 키 ),
Receiver (ECMAScript 언어 값 )를 인자로 받아,
ECMAScript 언어 값 를 포함하는 정상 완료 또는 throw completion 을
반환합니다. 호출 시 다음 단계를 수행합니다:
map 을 args .[[ParameterMap]] 로 둔다.
isMapped 를 ! HasOwnProperty (map ,
P )로 둔다.
isMapped 가 false 이면,
? OrdinaryGet (args ,
P , Receiver )를 반환한다.
그 외의 경우,
Assert :
map 에 P 에 대한 형식 매개변수 매핑이 있음을 보장한다.
! Get (map ,
P )를 반환한다.
10.4.4.4 [[Set]] ( P ,
V , Receiver )
arguments 익조틱 객체
args 의 [[Set]] 내부 메서드는 P (프로퍼티 키 ),
V (ECMAScript 언어 값 ),
Receiver (ECMAScript 언어 값 )를 인자로 받아, 불리언을
포함하는 정상 완료 또는 throw completion 을
반환합니다. 호출 시 다음 단계를 수행합니다:
SameValue (args ,
Receiver )가 false 이면,
isMapped 를 false 로 둔다.
그 외의 경우,
map 을 args .[[ParameterMap]] 로
둔다.
isMapped 를 ! HasOwnProperty (map ,
P )로 둔다.
isMapped 가 true 이면,
Assert :
아래 Set은 반드시 성공한다. arguments 객체에 의해 매핑되는 형식 매개변수는 항상 writable이다.
! Set (map ,
P , V , false )를 수행한다.
? OrdinarySet (args ,
P , V , Receiver )를 반환한다.
10.4.4.5 [[Delete]] ( P )
arguments 익조틱 객체
args 의 [[Delete]] 내부 메서드는 P (프로퍼티 키 )를 인자로
받아, 불리언을 포함하는 정상 완료 또는 throw completion 을
반환합니다. 호출 시 다음 단계를 수행합니다:
map 을 args .[[ParameterMap]] 로 둔다.
isMapped 를 ! HasOwnProperty (map ,
P )로 둔다.
result 를 ? OrdinaryDelete (args ,
P )로 둔다.
result 가 true 이고 isMapped 가
true 이면,
! map .[[Delete]] (P )를
수행한다.
result 를 반환한다.
10.4.4.6 CreateUnmappedArgumentsObject (
argumentsList )
추상 연산 CreateUnmappedArgumentsObject는 argumentsList (ECMAScript 언어 값의 리스트 )를
인자로 받아, 일반
객체 를 반환한다. 호출 시 다음 단계를 수행한다:
len 을 argumentsList 의 요소 개수로 둔다.
obj 를 OrdinaryObjectCreate (%Object.prototype% ,
« [[ParameterMap]] »)로 둔다.
obj .[[ParameterMap]] 을
undefined 로 설정한다.
! DefinePropertyOrThrow (obj ,
"length" , PropertyDescriptor { [[Value]] :
𝔽 (len ),
[[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
index 를 0으로 둔다.
index < len 인 동안 반복한다:
val 을 argumentsList [index ]로 둔다.
! CreateDataPropertyOrThrow (obj ,
! ToString (𝔽 (index )),
val )를 수행한다.
index 를 index + 1로 설정한다.
! DefinePropertyOrThrow (obj ,
%Symbol.iterator% ,
PropertyDescriptor { [[Value]] : %Array.prototype.values%,
[[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
! DefinePropertyOrThrow (obj ,
"callee" , PropertyDescriptor { [[Get]] :
%ThrowTypeError% , [[Set]] : %ThrowTypeError% ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
obj 를 반환한다.
10.4.4.7 CreateMappedArgumentsObject ( func ,
formals , argumentsList , env )
추상 연산 CreateMappedArgumentsObject는 func (객체), formals (파스
노드 ), argumentsList
(ECMAScript 언어 값의 리스트 ),
env (환경 레코드 )를 인자로 받아, arguments 익조틱 객체 를 반환한다. 호출 시 다음 단계를
수행한다:
Assert :
formals 는 rest 파라미터, 바인딩 패턴, 이니셜라이저를 포함하지 않는다. 중복 식별자를 포함할 수 있다.
len 을 argumentsList 의 요소 개수로 둔다.
obj 를 MakeBasicObject (« [[Prototype]] , [[Extensible]] , [[ParameterMap]] »)로 둔다.
obj .[[GetOwnProperty]] 를 10.4.4.1 에
명시된 대로 설정한다.
obj .[[DefineOwnProperty]] 를 10.4.4.2 에
명시된 대로 설정한다.
obj .[[Get]] 을 10.4.4.3 에
명시된 대로 설정한다.
obj .[[Set]] 을 10.4.4.4 에
명시된 대로 설정한다.
obj .[[Delete]] 를 10.4.4.5 에 명시된
대로 설정한다.
obj .[[Prototype]] 을 %Object.prototype% 로
설정한다.
map 을 OrdinaryObjectCreate (null )로
둔다.
obj .[[ParameterMap]] 을 map 으로 설정한다.
parameterNames 를 BoundNames of
formals 로 둔다.
numberOfParameters 를 parameterNames 의 요소 개수로 둔다.
index 를 0으로 둔다.
index < len 인 동안 반복한다:
val 을 argumentsList [index ]로 둔다.
! CreateDataPropertyOrThrow (obj ,
! ToString (𝔽 (index )),
val )를 수행한다.
index 를 index + 1로 설정한다.
! DefinePropertyOrThrow (obj ,
"length" , PropertyDescriptor { [[Value]] :
𝔽 (len ),
[[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
mappedNames 를 새로운 빈 리스트 로 둔다.
index 를 numberOfParameters - 1로 둔다.
index ≥ 0인 동안 반복한다:
name 을 parameterNames [index ]로 둔다.
mappedNames 에 name 이 없으면,
name 을 mappedNames 에 추가한다.
index < len 이면,
g 를 MakeArgGetter (name ,
env )로 둔다.
p 를 MakeArgSetter (name ,
env )로 둔다.
! map .[[DefineOwnProperty]] (! ToString (𝔽 (index )),
PropertyDescriptor { [[Set]] :
p , [[Get]] :
g , [[Enumerable]] :
false , [[Configurable]] :
true })를 수행한다.
index 를 index - 1로 설정한다.
! DefinePropertyOrThrow (obj ,
%Symbol.iterator% ,
PropertyDescriptor { [[Value]] : %Array.prototype.values%,
[[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
! DefinePropertyOrThrow (obj ,
"callee" , PropertyDescriptor { [[Value]] :
func , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
obj 를 반환한다.
10.4.4.7.1 MakeArgGetter ( name , env )
추상 연산 MakeArgGetter는 name (문자열), env (환경
레코드 )를 인자로 받아, 함수 객체 를 반환한다. 이 연산은 env 에서
name 에 바인딩된 값을 반환하는 내장 함수 객체 를 생성한다. 호출 시 다음 단계를 수행한다:
getterClosure 를, name 과 env 를 캡처하며, 인자가 없고, 호출 시
다음 단계를 수행하는 새로운 Abstract
Closure 로 둔다:
NormalCompletion (!
env .GetBindingValue(name ,
false ))을 반환한다.
getter 를 CreateBuiltinFunction (getterClosure ,
0, "" , « »)로 둔다.
참고: getter 는 ECMAScript 코드에서 직접 접근할 수 없다.
getter 를 반환한다.
10.4.4.7.2 MakeArgSetter ( name , env )
추상 연산 MakeArgSetter는 name (문자열), env (환경
레코드 )를 인자로 받아, 함수 객체 를 반환한다. 이 연산은 env 에서
name 에 바인딩된 값을 설정하는 내장 함수 객체 를 생성한다. 호출 시 다음 단계를 수행한다:
setterClosure 를, name 과 env 를 캡처하며, (value) 인자를
받고, 호출 시 다음 단계를 수행하는 새로운 Abstract
Closure 로 둔다:
NormalCompletion (!
env .SetMutableBinding(name , value ,
false ))을 반환한다.
setter 를 CreateBuiltinFunction (setterClosure ,
1, "" , « »)로 둔다.
참고: setter 는 ECMAScript 코드에서 직접 접근할 수 없다.
setter 를 반환한다.
10.4.5 TypedArray 익조틱 객체
TypedArray 는
익조틱 객체 로,
프로퍼티 키 중
정규 숫자 문자열 인 것들을 특별하게 처리하며, 그 중 경계
내의 정수
인덱스 에 해당하는 값은 균일 타입의 요소 인덱싱에 사용하고, 나머지는 프로토타입 체인 탐색 없이 존재하지 않는 것으로 강제하는
불변식을 유지합니다.
참고
어떤 Number n 에 대해서도 ToString (n )은 정규 숫자 문자열 이므로, 구현체는 실제로
문자열 변환을 수행하지 않고도 Number를 프로퍼티 키 로 간주하여 TypedArray 에 사용할 수 있습니다.
TypedArray 는
일반
객체 와 동일한 내부 슬롯을 가지며, 추가로 [[ViewedArrayBuffer]] ,
[[TypedArrayName]] , [[ContentType]] , [[ByteLength]] , [[ByteOffset]] , [[ArrayLength]] 내부 슬롯을 가집니다.
객체의 [[PreventExtensions]] , [[GetOwnProperty]] ,
[[HasProperty]] , [[DefineOwnProperty]] , [[Get]] , [[Set]] , [[Delete]] , [[OwnPropertyKeys]] 내부 메서드가 이 절의
정의를 따르고, 그 외의 필수 내부 메서드는 10.1 의 정의를
따른다면, 그 객체는 TypedArray 입니다. 이러한 메서드는
TypedArrayCreate 로 설치됩니다.
10.4.5.1 [[PreventExtensions]] ( )
TypedArray
O 의 [[PreventExtensions]] 내부 메서드는 인자를 받지 않으며, 불리언을 포함하는
정상 완료 를 반환합니다. 호출 시
다음 단계를 수행합니다:
참고: 6.1.7.3 의
확장성 관련 불변식에 따라, O 가 프로퍼티를 얻거나(또는 잃고 다시 얻거나) 할 수 있으면(예: 내부 버퍼가 리사이즈될 때 정수
인덱스 프로퍼티), 이 메서드는 true 를 반환할 수 없습니다.
IsTypedArrayFixedLength (O )
가 false 이면 false 를 반환합니다.
OrdinaryPreventExtensions (O )를
반환합니다.
10.4.5.2 [[GetOwnProperty]] (
P )
TypedArray
O 의 [[GetOwnProperty]] 내부 메서드는 P (프로퍼티 키 )를 인자로
받고, 프로퍼티 디스크립터 또는
undefined 를 포함하는 정상 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
P 가 문자열 이면,
numericIndex 를 CanonicalNumericIndexString (P )로
둔다.
numericIndex 가 undefined 가 아니면,
value 를 TypedArrayGetElement (O ,
numericIndex )로 둔다.
value 가 undefined 면
undefined 를 반환한다.
PropertyDescriptor { [[Value]] :
value , [[Writable]] :
true , [[Enumerable]] :
true , [[Configurable]] :
true }를 반환한다.
OrdinaryGetOwnProperty (O ,
P )를 반환한다.
10.4.5.3 [[HasProperty]] ( P
)
TypedArray
O 의 [[HasProperty]] 내부 메서드는 P (프로퍼티 키 )를 인자로
받고, 불리언 또는 throw completion 을
포함하는 정상 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
P 가 문자열 이면,
numericIndex 를 CanonicalNumericIndexString (P )로
둔다.
numericIndex 가 undefined 가 아니면 IsValidIntegerIndex (O ,
numericIndex )를 반환한다.
? OrdinaryHasProperty (O ,
P )를 반환한다.
10.4.5.4 [[DefineOwnProperty]] (
P , Desc )
TypedArray
O 의 [[DefineOwnProperty]] 내부 메서드는 P (프로퍼티 키 ),
Desc (프로퍼티
디스크립터 )를 인자로 받고, 불리언 또는 throw completion 을
포함하는 정상 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
P 가 문자열 이면,
numericIndex 를 CanonicalNumericIndexString (P )로
둔다.
numericIndex 가 undefined 가 아니면,
IsValidIntegerIndex (O ,
numericIndex )가 false 면
false 를 반환한다.
Desc 에 [[Configurable]] 필드가 있고
Desc .[[Configurable]] 이
false 면 false 를 반환한다.
Desc 에 [[Enumerable]] 필드가 있고
Desc .[[Enumerable]] 이
false 면 false 를 반환한다.
IsAccessorDescriptor (Desc )가
true 면 false 를 반환한다.
Desc 에 [[Writable]] 필드가 있고
Desc .[[Writable]] 이
false 면 false 를 반환한다.
Desc 에 [[Value]] 필드가 있으면,
? TypedArraySetElement (O ,
numericIndex , Desc .[[Value]] )를 수행한다.
true 를 반환한다.
! OrdinaryDefineOwnProperty (O ,
P , Desc )를 반환한다.
10.4.5.5 [[Get]] ( P ,
Receiver )
TypedArray
O 의 [[Get]] 내부 메서드는 P (프로퍼티 키 ),
Receiver (ECMAScript 언어 값 )를 인자로 받고,
ECMAScript 언어 값 또는 throw completion 을
포함하는 정상 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
P 가 문자열 이면,
numericIndex 를 CanonicalNumericIndexString (P )로
둔다.
numericIndex 가 undefined 가 아니면,
TypedArrayGetElement (O ,
numericIndex )를 반환한다.
? OrdinaryGet (O , P ,
Receiver )를 반환한다.
10.4.5.6 [[Set]] ( P ,
V , Receiver )
TypedArray
O 의 [[Set]] 내부 메서드는 P (프로퍼티 키 ),
V (ECMAScript 언어 값 ),
Receiver (ECMAScript 언어 값 )를 인자로 받고, 불리언
또는 throw completion 을
포함하는 정상 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
P 가 문자열 이면,
numericIndex 를 CanonicalNumericIndexString (P )로
둔다.
numericIndex 가 undefined 가 아니면,
SameValue (O ,
Receiver )가 true 이면,
? TypedArraySetElement (O ,
numericIndex , V )를 수행한다.
true 를 반환한다.
IsValidIntegerIndex (O ,
numericIndex )가 false 이면
true 를 반환한다.
? OrdinarySet (O , P ,
V , Receiver )를 반환한다.
10.4.5.7 [[Delete]] ( P )
TypedArray
O 의 [[Delete]] 내부 메서드는 P (프로퍼티 키 )를 인자로
받고, 불리언을 포함하는 정상 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
P 가 문자열 이면,
numericIndex 를 CanonicalNumericIndexString (P )로
둔다.
numericIndex 가 undefined 가 아니면,
IsValidIntegerIndex (O ,
numericIndex )가 false 이면
true 를 반환하고, 아니면 false 를 반환한다.
! OrdinaryDelete (O ,
P )를 반환한다.
10.4.5.8 [[OwnPropertyKeys]] ( )
[[OwnPropertyKeys]] 내부 메서드는 TypedArray
O 에 대해 인수를 받지 않으며, 정상 완성 레코드(normal
completion) 에 담긴 리스트(List) 를 반환합니다.
반환되는 리스트는 프로퍼티
키(property keys) 로 구성됩니다. 호출 시 다음 절차를 수행합니다:
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
seq-cst )로 설정한다.
keys 를 새로운 비어있는 리스트(List) 로
설정한다.
IsTypedArrayOutOfBounds (taRecord )
가 false 라면,
length 를 TypedArrayLength (taRecord )로
설정한다.
0 ≤ i < length 를 만족하는 정수(integer)
i 각각에 대해, 오름차순으로, 다음을 수행한다:
! ToString (𝔽 (i ))의 결과를
keys 에 추가한다.
O 의 자신의 프로퍼티 키(property key) P 각각에
대해, P 가 문자열(String) 이고
P 가 정수 인덱스(integer index) 가 아닌 경우, 프로퍼티 생성의
시간 순서대로 다음을 수행한다:
P 를 keys 에 추가한다.
O 의 자신의 프로퍼티 키(property key) P 각각에
대해, P 가 심볼(Symbol) 인
경우, 프로퍼티 생성의 시간 순서대로 다음을 수행한다:
P 를 keys 에 추가한다.
keys 를 반환한다.
10.4.5.9 TypedArray With Buffer Witness Records
TypedArray With
Buffer Witness Record 는 레코드(Record) 값으로,
TypedArray 와
함께 버퍼의 바이트 길이 캐시를 캡슐화합니다. 이는
확장 가능한
SharedArrayBuffer 를 볼 때,
바이트 길이 데이터 블록에 대한 단일 공유 메모리 읽기 이벤트가 보장되도록 돕기 위해 사용됩니다.
TypedArray With Buffer Witness Record에는 표 32 에 나열된
필드가 있습니다.
표 32: TypedArray
With Buffer Witness Record 필드
Field Name
Value
Meaning
[[Object]]
TypedArray
바이트 길이가 로드되는 TypedArray .
[[CachedBufferByteLength]]
음수가 아닌 정수(integer) 또는
detached
레코드 가
생성될 때
객체의 [[ViewedArrayBuffer]] 의 바이트 길이.
10.4.5.10 MakeTypedArrayWithBufferWitnessRecord (
obj , order )
추상 연산 MakeTypedArrayWithBufferWitnessRecord는 인수 obj
(TypedArray )
와 order
(seq-cst 또는 unordered )를 받아 TypedArray With Buffer Witness
Record 를 반환합니다. 호출 시 다음 절차를 수행합니다:
buffer 를 obj .[[ViewedArrayBuffer]] 로
설정한다.
IsDetachedBuffer (buffer )
가 true 이면,
byteLength 를 detached 로 설정한다.
그 외의 경우,
byteLength 를 ArrayBufferByteLength (buffer ,
order )의 결과로 설정한다.
TypedArray
With Buffer Witness Record { [[Object]] :
obj , [[CachedBufferByteLength]] :
byteLength } 를 반환한다.
10.4.5.11 TypedArrayCreate ( prototype )
추상 연산 TypedArrayCreate는 prototype (객체)을 인수로 받아 TypedArray 를 반환한다. 이는 새로운 TypedArrays 를 생성하는
방법을 명시하는 데 사용된다. 호출 시 다음 단계를 수행한다:
internalSlotsList 를 « [[Prototype]] , [[Extensible]] , [[ViewedArrayBuffer]] ,
[[TypedArrayName]] , [[ContentType]] ,
[[ByteLength]] ,
[[ByteOffset]] , [[ArrayLength]] »로 한다.
A 를 MakeBasicObject (internalSlotsList )로
한다.
A .[[PreventExtensions]] 를 10.4.5.1 에 명시된 대로
설정한다.
A .[[GetOwnProperty]] 를 10.4.5.2 에 명시된 대로 설정한다.
A .[[HasProperty]] 를 10.4.5.3 에 명시된 대로 설정한다.
A .[[DefineOwnProperty]] 를 10.4.5.4 에 명시된 대로
설정한다.
A .[[Get]] 을 10.4.5.5 에 명시된 대로
설정한다.
A .[[Set]] 을 10.4.5.6 에 명시된 대로
설정한다.
A .[[Delete]] 를 10.4.5.7 에 명시된 대로 설정한다.
A .[[OwnPropertyKeys]] 를 10.4.5.8 에 명시된 대로 설정한다.
A .[[Prototype]] 을 prototype 으로 설정한다.
A 를 반환한다.
10.4.5.12 TypedArrayByteLength ( taRecord )
추상 연산 TypedArrayByteLength는 taRecord (TypedArray With Buffer Witness
Record )를 인수로 받아 0 이상의 정수(integer) 를 반환한다. 호출 시 다음 단계를 수행한다:
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 0을 반환한다.
length 를 TypedArrayLength (taRecord )로
한다.
length = 0이면 0을 반환한다.
O 를 taRecord .[[Object]] 로 한다.
O .[[ByteLength]] 가 auto 가
아니면 O .[[ByteLength]] 를 반환한다.
elementSize 를 TypedArrayElementSize (O )로
한다.
length × elementSize 를 반환한다.
10.4.5.13 TypedArrayLength ( taRecord )
추상 연산 TypedArrayLength는 taRecord (TypedArray With Buffer Witness
Record )를 인수로 받아 0 이상의 정수(integer) 를 반환한다. 호출 시 다음 단계를 수행한다:
Assert :
IsTypedArrayOutOfBounds (taRecord )
는 false 이다.
O 를 taRecord .[[Object]] 로 한다.
O .[[ArrayLength]] 가 auto 가
아니면 O .[[ArrayLength]] 를 반환한다.
Assert :
IsFixedLengthArrayBuffer (O .[[ViewedArrayBuffer]] )는 false 이다.
byteOffset 을 O .[[ByteOffset]] 로 한다.
elementSize 를 TypedArrayElementSize (O )로
한다.
byteLength 를 taRecord .[[CachedBufferByteLength]] 로 한다.
Assert :
byteLength 는 detached 가 아니다.
floor ((byteLength -
byteOffset ) / elementSize )를 반환한다.
10.4.5.14 IsTypedArrayOutOfBounds ( taRecord )
추상 연산 IsTypedArrayOutOfBounds는 taRecord (TypedArray With Buffer Witness
Record )를 인수로 받아 불리언 값을 반환한다. 이 연산은 객체의 수치 프로퍼티가 기본 버퍼의 범위 내에 포함되지 않은
인덱스를 참조하는지 검사한다. 호출 시 다음 단계를 수행한다:
O 를 taRecord .[[Object]] 로 한다.
bufferByteLength 를 taRecord .[[CachedBufferByteLength]] 로 한다.
Assert :
IsDetachedBuffer (O .[[ViewedArrayBuffer]] )는 true 이고 오직
bufferByteLength 가 detached 일 때만 그렇다.
bufferByteLength 가 detached 이면
true 를 반환한다.
byteOffsetStart 를 O .[[ByteOffset]] 로
한다.
O .[[ArrayLength]] 가
auto 이면,
byteOffsetEnd 를 bufferByteLength 로 한다.
그 외의 경우,
elementSize 를 TypedArrayElementSize (O )로
한다.
byteOffsetEnd 를 byteOffsetStart +
O .[[ArrayLength]] ×
elementSize 로 한다.
byteOffsetStart > bufferByteLength 이거나
byteOffsetEnd > bufferByteLength 이면 true 를
반환한다.
참고: 길이가 0인 TypedArrays 는 out-of-bounds로 간주하지 않는다.
false 를 반환한다.
10.4.5.15 IsTypedArrayFixedLength ( O )
추상 연산 IsTypedArrayFixedLength는 O (TypedArray )를 인수로 받아 불리언 값을 반환한다. 호출 시 다음 단계를 수행한다:
O .[[ArrayLength]] 가 auto 이면
false 를 반환한다.
buffer 를 O .[[ViewedArrayBuffer]] 로 한다.
IsFixedLengthArrayBuffer (buffer )
가 false 이고 IsSharedArrayBuffer (buffer )
가 false 이면 false 를 반환한다.
true 를 반환한다.
10.4.5.16 IsValidIntegerIndex ( O , index )
추상 연산 IsValidIntegerIndex는 O (TypedArray )와
index (숫자)를 인수로 받아 불리언 값을 반환한다. 호출 시 다음 단계를 수행한다:
IsDetachedBuffer (O .[[ViewedArrayBuffer]] )가 true 이면
false 를 반환한다.
index 가 정수(Number) 가 아니면
false 를 반환한다.
index 가 -0 𝔽 이거나 index <
-0 𝔽 이면 false 를 반환한다.
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
unordered )로 한다.
참고: O 의 backing buffer가 확장 가능한
SharedArrayBuffer 일 때 bounds 체크는 동기화 연산이 아니다.
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 false 를 반환한다.
length 를 TypedArrayLength (taRecord )로
한다.
ℝ (index )
≥ length 이면 false 를 반환한다.
true 를 반환한다.
10.4.5.17 TypedArrayGetElement ( O , index
)
추상 연산 TypedArrayGetElement는 O (TypedArray )와
index (숫자)를 인수로 받아 숫자(Number), BigInt 또는 undefined 를 반환한다.
호출 시 다음 단계를 수행한다:
IsValidIntegerIndex (O ,
index )가 false 이면 undefined 를 반환한다.
offset 를 O .[[ByteOffset]] 로 한다.
elementSize 를 TypedArrayElementSize (O )로
한다.
byteIndexInBuffer 를 (ℝ (index ) × elementSize ) +
offset 로 한다.
elementType 를 TypedArrayElementType (O )로
한다.
GetValueFromBuffer (O .[[ViewedArrayBuffer]] , byteIndexInBuffer ,
elementType , true , unordered )의
결과를 반환한다.
10.4.5.18 TypedArraySetElement ( O , index ,
value )
추상 연산 TypedArraySetElement는 O (TypedArray ),
index (숫자), value (ECMAScript 언어 값 )을
인수로 받아
normal completion
containing unused 또는 throw completion 을
반환한다. 호출 시 다음 단계를 수행한다:
O .[[ContentType]] 이
bigint 이면, numValue 를 ? ToBigInt (value )로 한다.
그 외에는, numValue 를 ? ToNumber (value )로 한다.
IsValidIntegerIndex (O ,
index )가 true 이면,
offset 을 O .[[ByteOffset]] 로 한다.
elementSize 를 TypedArrayElementSize (O )로
한다.
byteIndexInBuffer 를 (ℝ (index ) ×
elementSize ) + offset 으로 한다.
elementType 을 TypedArrayElementType (O )로
한다.
SetValueInBuffer (O .[[ViewedArrayBuffer]] , byteIndexInBuffer ,
elementType , numValue , true ,
unordered )를 수행한다.
unused 를 반환한다.
참고
이 연산은 항상 성공하는 것처럼 보이지만, TypedArray 의 끝을 넘어 쓰기를 시도하거나
분리(detached)된 ArrayBuffer를 사용하는 TypedArray 에 쓰기를 시도하면 아무 효과가 없다.
10.4.5.19 IsArrayBufferViewOutOfBounds ( O )
추상 연산 IsArrayBufferViewOutOfBounds는 O (TypedArray 또는 DataView)를 인수로 받아 불리언
값을 반환한다. 이 연산은 TypedArray 의 수치 프로퍼티 또는 DataView 객체의 메서드가 기본 데이터
블록의 범위 내에 포함되지 않은 인덱스를 참조할 수 있는지 검사한다. 이 추상 연산은 상위 명세에서 편의를 위해 존재한다. 호출 시 다음 단계를 수행한다:
O 에 [[DataView]] 내부 슬롯이 있으면,
viewRecord 를 MakeDataViewWithBufferWitnessRecord (O ,
seq-cst )로 한다.
IsViewOutOfBounds (viewRecord )의
결과를 반환한다.
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
seq-cst )로 한다.
IsTypedArrayOutOfBounds (taRecord )의
결과를 반환한다.
10.4.6 모듈 네임스페이스 이그조틱 객체(Module Namespace Exotic Objects)
모듈 네임스페이스 이그조틱 객체 는
이그조틱 객체 로,
ECMAScript Module 에서 내보낸 바인딩을
노출합니다(자세한 내용은 16.2.3 참조).
모듈 네임스페이스 이그조틱 객체 의 문자열 키를 갖는 자신의
프로퍼티와
Module 이 내보낸 바인딩 이름 사이에는 일대일 대응이
있습니다.
내보낸 바인딩에는 export *로 간접적으로 내보낸 바인딩도 포함됩니다. 각 문자열 값의 자신의
프로퍼티 키 는 해당
내보낸 바인딩 이름의 StringValue 입니다.
이것들은 모듈 네임스페이스 이그조틱 객체 의 유일한 문자열 키
프로퍼티입니다.
각 프로퍼티의 속성은 { [[Writable]] :
true , [[Enumerable]] : true , [[Configurable]] : false }입니다.
모듈 네임스페이스 이그조틱 객체 는 확장할 수 없습니다.
객체의 [[GetPrototypeOf]] , [[SetPrototypeOf]] ,
[[IsExtensible]] , [[PreventExtensions]] , [[GetOwnProperty]] , [[DefineOwnProperty]] , [[HasProperty]] , [[Get]] , [[Set]] , [[Delete]] , [[OwnPropertyKeys]] 내부 메서드가 이 절의 정의를 사용하고,
나머지 필수 내부 메서드는 10.1 의 정의를
사용하는 경우, 그 객체는
모듈 네임스페이스 이그조틱 객체 입니다.
이러한 메서드는 ModuleNamespaceCreate 에 의해 설치됩니다.
모듈 네임스페이스 이그조틱 객체 는
표 33 에 정의된
내부 슬롯을 가집니다.
표 33: 모듈 네임스페이스 이그조틱 객체의 내부 슬롯
10.4.6.1 [[GetPrototypeOf]] ( )
모듈 네임스페이스 이그조틱 객체 의 [[GetPrototypeOf]] 내부 메서드는 인수를 받지 않으며 정상 완성(normal
completion) 에 담긴 null 을 반환합니다. 호출 시 다음 단계를 수행합니다:
null 을 반환한다.
10.4.6.2 [[SetPrototypeOf]] (
V )
모듈 네임스페이스 이그조틱 객체
O 의 [[SetPrototypeOf]] 내부 메서드는 V (객체 또는
null )를 인수로 받아 정상 완성(normal
completion) 에 담긴 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:
! SetImmutablePrototype (O ,
V )의 결과를 반환한다.
10.4.6.3 [[IsExtensible]] ( )
모듈 네임스페이스 이그조틱 객체 의 [[IsExtensible]] 내부 메서드는 인수를 받지 않으며 정상 완성(normal
completion) 에 담긴 false 를 반환합니다. 호출 시 다음 단계를 수행합니다:
false 를 반환한다.
10.4.6.4 [[PreventExtensions]] ( )
모듈 네임스페이스 이그조틱 객체 의 [[PreventExtensions]] 내부 메서드는 인수를 받지 않으며 정상 완성(normal
completion) 에 담긴 true 를 반환합니다. 호출 시 다음 단계를 수행합니다:
true 를 반환한다.
10.4.6.5 [[GetOwnProperty]] (
P )
모듈 네임스페이스 이그조틱 객체
O 의 [[GetOwnProperty]] 내부 메서드는 P (프로퍼티 키 )를 인수로
받아 정상 완성(normal
completion) 에 담긴 프로퍼티 디스크립터(Property
Descriptor) 또는 undefined 를 반환하거나, throw completion 을
반환합니다. 호출 시 다음 단계를 수행합니다:
P 가 심볼(Symbol) 이면,
OrdinaryGetOwnProperty (O ,
P )를 반환한다.
exports 를 O .[[Exports]] 로 한다.
exports 가 P 를 포함하지 않으면 undefined 를 반환한다.
value 를 ? O .[[Get]] (P ,
O )로 한다.
PropertyDescriptor { [[Value]] : value ,
[[Writable]] : true , [[Enumerable]] : true , [[Configurable]] : false }를 반환한다.
10.4.6.6 [[DefineOwnProperty]] (
P , Desc )
모듈 네임스페이스 이그조틱 객체
O 의 [[DefineOwnProperty]] 내부 메서드는 P (프로퍼티 키 )와
Desc
(프로퍼티 디스크립터(Property
Descriptor) )를 인수로 받아 정상 완성(normal
completion) 에 담긴 불리언이나 throw completion 을
반환합니다. 호출 시 다음 단계를 수행합니다:
P 가 심볼(Symbol) 이면,
! OrdinaryDefineOwnProperty (O ,
P , Desc )를 반환한다.
current 를 ? O .[[GetOwnProperty]] (P )로 한다.
current 가 undefined 이면 false 를 반환한다.
Desc 에 [[Configurable]] 필드가 있고
Desc .[[Configurable]] 가
true 이면 false 를 반환한다.
Desc 에 [[Enumerable]] 필드가 있고
Desc .[[Enumerable]] 가 false 이면,
false 를 반환한다.
IsAccessorDescriptor (Desc )
가 true 이면 false 를 반환한다.
Desc 에 [[Writable]] 필드가 있고
Desc .[[Writable]] 가 false 이면,
false 를 반환한다.
Desc 에 [[Value]] 필드가 있으면, SameValue (Desc .[[Value]] , current .[[Value]] )를 반환한다.
true 를 반환한다.
10.4.6.7 [[HasProperty]] ( P
)
모듈 네임스페이스 이그조틱 객체
O 의 [[HasProperty]] 내부 메서드는 P (프로퍼티 키 )를 인수로
받아 정상 완성(normal
completion) 에 담긴 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:
P 가 심볼(Symbol) 이면,
! OrdinaryHasProperty (O ,
P )를 반환한다.
exports 를 O .[[Exports]] 로 한다.
exports 에 P 가 포함되어 있으면 true 를 반환한다.
false 를 반환한다.
10.4.6.8 [[Get]] ( P ,
Receiver )
모듈 네임스페이스 이그조틱 객체
O 의 [[Get]] 내부 메서드는 P (프로퍼티 키 )와
Receiver (ECMAScript 언어 값 )를 인수로 받아
정상 완성(normal
completion) 에 담긴 ECMAScript 언어 값
또는 throw completion 을
반환합니다. 호출 시 다음 단계를 수행합니다:
P 가 심볼(Symbol) 이면,
! OrdinaryGet (O ,
P , Receiver )를 반환한다.
exports 를 O .[[Exports]] 로 한다.
exports 가 P 를 포함하지 않으면 undefined 를 반환한다.
m 을 O .[[Module]] 로 한다.
binding 을 m .ResolveExport(P )로 한다.
Assert :
binding 은 ResolvedBinding 레코드 이다.
targetModule 을 binding .[[Module]] 로 한다.
Assert :
targetModule 은 undefined 가 아니다.
binding .[[BindingName]] 이
namespace 이면,
GetModuleNamespace (targetModule )를
반환한다.
targetEnv 를 targetModule .[[Environment]] 로 한다.
targetEnv 가 empty 이면
ReferenceError 예외를 던진다.
? targetEnv .GetBindingValue(binding .[[BindingName]] , true )를 반환한다.
참고
ResolveExport는 부작용이 없습니다. 이 연산이 특정 exportName , resolveSet 쌍을
인수로 받아 호출될 때마다 항상 같은 결과를 반환해야 합니다. 구현체는 각 [[Exports]] 에 대해
ResolveExport 결과를 미리 계산하거나 캐시할 수 있습니다.
10.4.6.9 [[Set]] ( P ,
V , Receiver )
모듈 네임스페이스 이그조틱 객체 의 [[Set]] 내부 메서드는 P (프로퍼티 키 ), V (ECMAScript 언어 값 ),
Receiver (ECMAScript 언어 값 )를 인수로 받아
정상 완성(normal
completion) 에 담긴 false 를 반환합니다. 호출 시 다음 단계를 수행합니다:
false 를 반환한다.
10.4.6.10 [[Delete]] ( P )
모듈 네임스페이스 이그조틱 객체
O 의 [[Delete]] 내부 메서드는 P (프로퍼티 키 )를 인수로
받아 정상 완성(normal
completion) 에 담긴 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:
P 가 심볼(Symbol) 이면,
! OrdinaryDelete (O ,
P )를 반환한다.
exports 를 O .[[Exports]] 로 한다.
exports 에 P 가 포함되어 있으면 false 를 반환한다.
true 를 반환한다.
10.4.6.11 [[OwnPropertyKeys]] ( )
모듈 네임스페이스 이그조틱 객체
O 의 [[OwnPropertyKeys]] 내부 메서드는 인수를 받지 않으며, 정상 완성(normal
completion) 에 담긴 프로퍼티 키의 리스트(List) 를
반환합니다. 호출 시 다음 단계를 수행합니다:
exports 를 O .[[Exports]] 로 한다.
symbolKeys 를 OrdinaryOwnPropertyKeys (O )로
한다.
exports 와 symbolKeys 의 리스트
연결(list-concatenation) 결과를 반환한다.
10.4.6.12 ModuleNamespaceCreate ( module ,
exports )
추상 연산 ModuleNamespaceCreate는 module (Module Record )와
exports (문자열의 리스트(List) )를 인수로 받아
module namespace exotic
object 를 반환한다. 이는 새로운 module namespace exotic
objects 의 생성을 명시하는 데 사용된다. 호출 시 다음 절차를 수행한다:
Assert :
module .[[Namespace]] 가
empty 이다.
internalSlotsList 를 표
33 에 나열된 내부 슬롯들로 한다.
M 을 MakeBasicObject (internalSlotsList )로
한다.
M 의 필수 내부 메서드들을 10.4.6 에 명시된 정의로
설정한다.
M .[[Module]] 에 module 을 할당한다.
sortedExports 를 exports 의 요소들을 lexicographic code unit
order 에 따라 정렬한 리스트(List) 로 한다.
M .[[Exports]] 에 sortedExports 를 할당한다.
28.3 에 정의된 대로
M 의 자신의 프로퍼티들을 생성한다.
module .[[Namespace]] 에 M 을 할당한다.
M 을 반환한다.
10.4.7 불변 프로토타입 이그조틱 객체(Immutable Prototype Exotic Objects)
불변 프로토타입 이그조틱 객체 는 이그조틱 객체 이며, 초기화된
후 변경되지 않는 [[Prototype]] 내부 슬롯을 가진다.
객체의 [[SetPrototypeOf]] 내부 메서드가 다음 구현을 사용할 때, 그 객체는 불변 프로토타입 이그조틱 객체 이다. (다른 필수 내부 메서드는 구체적인 불변 프로토타입 이그조틱 객체 에 따라 임의의 구현을
사용할 수 있다.)
참고
다른 이그조틱
객체 와 달리, 불변 프로토타입 이그조틱
객체 에 대해 별도의 생성 추상 연산이 제공되지 않는다. 이는 이 객체들이 %Object.prototype%
및 호스트
환경 에서만 사용되며, 호스트 환경에서는 관련 객체가 다른 방식으로 이그조틱할 수 있으므로 별도의 생성 연산이 필요하기
때문이다.
10.4.7.1 [[SetPrototypeOf]] (
V )
불변 프로토타입 이그조틱 객체
O 의 [[SetPrototypeOf]] 내부 메서드는 인수 V (객체 또는
null )를 받아 정상 완료(normal
completion) 불리언 또는 throw completion 을
반환한다. 호출 시 다음 절차를 수행한다:
? SetImmutablePrototype (O ,
V )를 반환한다.
10.4.7.2 SetImmutablePrototype ( O , V )
추상 연산 SetImmutablePrototype은 O (객체)와 V (객체 또는 null )를
인수로 받아 정상 완료(normal
completion) 불리언 또는 throw completion 을
반환한다. 호출 시 다음 절차를 수행한다:
current 를 ? O .[[GetPrototypeOf]] ()로 한다.
SameValue (V ,
current )가 true 이면 true 를 반환한다.
false 를 반환한다.
10.5 프록시 객체 내부 메서드 및 내부 슬롯
프록시 객체는 익조틱
객체 로, 필수 내부 메서드가 부분적으로 ECMAScript 코드로 구현되어 있습니다. 모든 프록시 객체는 [[ProxyHandler]] 라는 내부 슬롯을 가집니다. [[ProxyHandler]] 의
값은
프록시의 핸들러 객체 라 불리는 객체이거나 null 입니다. 핸들러 객체의 메서드들(표
34 참고)은 하나 이상의 프록시 객체 내부 메서드의 구현을 보강하는 데 사용될 수 있습니다. 모든 프록시 객체는 또한 [[ProxyTarget]] 이라는 내부 슬롯을 가지며, 그 값은 객체이거나 null 입니다. 이 객체를
프록시의 타겟 객체 라고 합니다.
객체가 필수 내부 메서드([[Call]]
및 [[Construct]] 를 포함, 해당되는 경우) 구현에 이 절의 정의를 사용하는 경우, 해당 객체를 프록시 익조틱 객체 라고 합니다.
이러한 내부 메서드는 ProxyCreate 에서 설치됩니다.
표 34: 프록시 핸들러 메서드
내부 메서드
핸들러 메서드
[[GetPrototypeOf]]
getPrototypeOf
[[SetPrototypeOf]]
setPrototypeOf
[[IsExtensible]]
isExtensible
[[PreventExtensions]]
preventExtensions
[[GetOwnProperty]]
getOwnPropertyDescriptor
[[DefineOwnProperty]]
defineProperty
[[HasProperty]]
has
[[Get]]
get
[[Set]]
set
[[Delete]]
deleteProperty
[[OwnPropertyKeys]]
ownKeys
[[Call]]
apply
[[Construct]]
construct
핸들러 메서드가 프록시 객체 내부 메서드의 구현을 제공하기 위해 호출될 때, 핸들러 메서드에는 프록시의 타겟 객체가 인자로 전달됩니다. 프록시의 핸들러 객체는 모든 필수 내부
메서드에 해당하는 메서드를 반드시 가질 필요는 없습니다. 프록시에 대해 내부 메서드를 호출할 때 핸들러 객체에 해당 트랩 메서드가 없으면, 프록시의 타겟 객체의 해당 내부 메서드가
호출됩니다.
프록시 객체의 [[ProxyHandler]] 및 [[ProxyTarget]] 내부 슬롯은
객체가 생성될 때 항상 초기화되며 일반적으로 수정할 수 없습니다. 일부 프록시 객체는 이후에 해제(revoke) 될 수 있도록 생성됩니다. 프록시가 해제되면 해당
프록시의 [[ProxyHandler]] 및 [[ProxyTarget]] 내부 슬롯이
null 로 설정되어, 이후 해당 프록시 객체의 내부 메서드 호출 시 TypeError 예외가 발생하게 됩니다.
프록시 객체는 내부 메서드의 구현을 임의의 ECMAScript 코드로 제공할 수 있으므로, 핸들러 메서드가 6.1.7.3 에 정의된
불변 조건(invariant)을 위반하는 프록시 객체를 정의하는 것도 가능합니다.
6.1.7.3 에 정의된 일부 내부
메서드 불변 조건은 본질적인 무결성 불변 조건입니다. 이러한 불변 조건은 본 절에 명시된 프록시 객체 내부 메서드에 의해 명시적으로 강제됩니다. ECMAScript 구현체는 모든
가능한 불변 조건 위반에도 견고해야 합니다.
다음 알고리즘 설명에서, O 는 ECMAScript 프록시 객체, P 는 프로퍼티 키 값, V 는 ECMAScript 언어 값 , Desc 는
프로퍼티 디스크립터
레코드라고 가정합니다.
10.5.1 [[GetPrototypeOf]] ( )
프록시 익조틱
객체 O 의 [[GetPrototypeOf]] 내부 메서드는 인자를
받지 않으며, 객체 또는 null 을 포함하는 정상 완료 이거나 예외 완료 를 반환합니다. 호출 시 다음
단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"getPrototypeOf" )로 한다.
trap 이 undefined 이면,
? target .[[GetPrototypeOf]] ()를 반환한다.
handlerProto 를 ? Call (trap ,
handler , « target »)로 한다.
handlerProto 가 객체가 아니고 null 도 아니면,
TypeError 예외를 발생시킨다.
extensibleTarget 을 ? IsExtensible (target )로 한다.
extensibleTarget 이 true 이면 handlerProto 를 반환한다.
targetProto 를 ? target .[[GetPrototypeOf]] ()로 한다.
SameValue (handlerProto ,
targetProto )가 false 이면, TypeError 예외를
발생시킨다.
handlerProto 를 반환한다.
참고
프록시 객체의 [[GetPrototypeOf]] 는 다음 불변 조건을 강제합니다:
[[GetPrototypeOf]] 의 결과는 객체 또는 null 이어야
합니다.
타겟 객체가 확장 가능하지 않은 경우, 프록시 객체에 적용된 [[GetPrototypeOf]] 는 타겟
객체에 적용된 [[GetPrototypeOf]] 와 동일한 값을 반환해야 합니다.
10.5.2 [[SetPrototypeOf]] ( V )
프록시 익조틱
객체 O 의 [[SetPrototypeOf]] 내부 메서드는 인자
V (객체 또는 null )를 받고, 불리언을 포함하는 정상 완료 이거나 예외 완료 를 반환합니다. 호출 시 다음
단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"setPrototypeOf" )로 한다.
trap 이 undefined 이면,
? target .[[SetPrototypeOf]] (V )를 반환한다.
booleanTrapResult 를 ToBoolean (? Call (trap , handler , «
target , V »))로 한다.
booleanTrapResult 가 false 이면 false 를 반환한다.
extensibleTarget 을 ? IsExtensible (target )로 한다.
extensibleTarget 이 true 이면 true 를 반환한다.
targetProto 를 ? target .[[GetPrototypeOf]] ()로 한다.
SameValue (V ,
targetProto )가 false 이면 TypeError 예외를
발생시킨다.
true 를 반환한다.
참고
프록시 객체의 [[SetPrototypeOf]] 는 다음 불변 조건을 강제합니다:
[[SetPrototypeOf]] 의 결과는 불리언 값이어야
합니다.
타겟 객체가 확장 가능하지 않은 경우, 인자 값은 타겟 객체에 적용된 [[GetPrototypeOf]] 의
결과와 동일해야 합니다.
10.5.3 [[IsExtensible]] ( )
프록시 익조틱
객체 O 의 [[IsExtensible]] 내부 메서드는 인자를 받지
않으며, 불리언을 포함하는 정상 완료 이거나 예외 완료 를 반환합니다. 호출 시 다음
단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"isExtensible" )로 한다.
trap 이 undefined 이면,
? IsExtensible (target )을
반환한다.
booleanTrapResult 를 ToBoolean (? Call (trap , handler , «
target »))로 한다.
targetResult 를 ? IsExtensible (target )로 한다.
booleanTrapResult 가 targetResult 와 다르면 TypeError
예외를 발생시킨다.
booleanTrapResult 를 반환한다.
참고
프록시 객체의 [[IsExtensible]] 는 다음 불변 조건을 강제합니다:
[[IsExtensible]] 의 결과는 불리언 값이어야
합니다.
프록시 객체에 적용된 [[IsExtensible]] 는 동일한 인자와 함께 프록시 객체의 타겟 객체에 적용된
[[IsExtensible]] 와 동일한 값을 반환해야 합니다.
10.5.4 [[PreventExtensions]] ( )
프록시 익조틱
객체 O 의 [[PreventExtensions]] 내부 메서드는
인자를 받지 않으며, 불리언을 포함하는 정상 완료 이거나
예외 완료 를 반환합니다. 호출 시 다음
단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"preventExtensions" )로 한다.
trap 이 undefined 이면,
? target .[[PreventExtensions]] () 를 반환한다.
booleanTrapResult 를 ToBoolean (? Call (trap , handler , «
target »))로 한다.
booleanTrapResult 가 true 이면,
extensibleTarget 을 ? IsExtensible (target )로 한다.
extensibleTarget 이 true 이면
TypeError 예외를 발생시킨다.
booleanTrapResult 를 반환한다.
참고
프록시 객체의 [[PreventExtensions]] 는 다음 불변 조건을 강제합니다:
[[PreventExtensions]] 의 결과는 불리언 값이어야
합니다.
프록시 객체에 적용된 [[PreventExtensions]] 는 프록시 객체의 타겟 객체에 적용된 [[IsExtensible]] 가 false 일 때만
true 를 반환합니다.
10.5.5 [[GetOwnProperty]] ( P )
프록시 익조틱
객체 O 의 [[GetOwnProperty]] 내부 메서드는 인자
P (프로퍼티
키 )를 받고,
정상 완료 로 프로퍼티 디스크립터 또는
undefined 을, 혹은 예외 완료 를
반환합니다. 호출 시 다음 단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"getOwnPropertyDescriptor" )로 한다.
trap 이 undefined 이면,
? target .[[GetOwnProperty]] (P )를 반환한다.
trapResultObj 를 ? Call (trap ,
handler , « target , P »)로 한다.
trapResultObj 가 객체가 아니고 undefined 도
아니면, TypeError 예외를 발생시킨다.
targetDesc 를 ? target .[[GetOwnProperty]] (P )로 한다.
trapResultObj 가 undefined 이면,
targetDesc 가 undefined 이면
undefined 를 반환한다.
targetDesc .[[Configurable]] 이
false 이면 TypeError 예외를 발생시킨다.
extensibleTarget 를 ? IsExtensible (target )로 한다.
extensibleTarget 이 false 이면
TypeError 예외를 발생시킨다.
undefined 를 반환한다.
extensibleTarget 를 ? IsExtensible (target )로 한다.
resultDesc 를 ? ToPropertyDescriptor (trapResultObj )로
한다.
CompletePropertyDescriptor (resultDesc )를
수행한다.
valid 를 IsCompatiblePropertyDescriptor (extensibleTarget ,
resultDesc , targetDesc )로 한다.
valid 가 false 이면 TypeError 예외를 발생시킨다.
resultDesc .[[Configurable]] 이
false 이면,
targetDesc 가 undefined 이거나
targetDesc .[[Configurable]] 이
true 이면,
TypeError 예외를 발생시킨다.
resultDesc 가 [[Writable]] 필드를 가지고
resultDesc .[[Writable]] 이
false 이면,
Assert : targetDesc 는
[[Writable]] 필드를 가진다.
targetDesc .[[Writable]] 이
true 이면 TypeError 예외를 발생시킨다.
resultDesc 를 반환한다.
참고
프록시 객체의 [[GetOwnProperty]] 는 다음 불변 조건을 강제합니다:
[[GetOwnProperty]] 의 결과는 객체 또는
undefined 여야 합니다.
타겟 객체에 비구성 가능(Non-configurable) 자체 프로퍼티가 존재할 때, 해당 프로퍼티는 존재하지 않는 것으로 보고될 수 없습니다.
타겟 객체가 확장 불가능(Non-extensible)하고 해당 프로퍼티가 자체 프로퍼티로 존재할 때, 해당 프로퍼티는 존재하지 않는 것으로 보고될 수
없습니다.
타겟 객체가 확장 불가능하고 해당 프로퍼티가 자체 프로퍼티로 존재하지 않는 경우, 해당 프로퍼티는 존재하는 것으로 보고될 수 없습니다.
타겟 객체에 비구성 가능 자체 프로퍼티가 존재하지 않는 한, 프로퍼티를 비구성 가능으로 보고할 수 없습니다.
타겟 객체에 비구성 가능, 비쓰기 가능(non-writable) 자체 프로퍼티가 존재하지 않는 한, 프로퍼티를 동시에 비구성 가능 및 비쓰기 가능으로
보고할 수 없습니다.
10.5.6 [[DefineOwnProperty]] (
P , Desc )
프록시 익조틱
객체 O 의 [[DefineOwnProperty]] 내부 메서드는
인자 P (프로퍼티
키 )와
Desc (프로퍼티 디스크립터 )를 받아
정상 완료 로 불리언을,
혹은 예외 완료 를 반환합니다. 호출 시 다음
단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"defineProperty" )로 한다.
trap 이 undefined 이면,
? target .[[DefineOwnProperty]] (P ,
Desc )를 반환한다.
descObj 를 FromPropertyDescriptor (Desc )로
한다.
booleanTrapResult 를 ToBoolean (? Call (trap , handler , «
target , P , descObj »))로 한다.
booleanTrapResult 가 false 이면 false 를 반환한다.
targetDesc 를 ? target .[[GetOwnProperty]] (P )로 한다.
extensibleTarget 를 ? IsExtensible (target )로 한다.
Desc 가 [[Configurable]] 필드를 가지고
Desc .[[Configurable]] 이 false 이면,
settingConfigFalse 를 true 로 한다.
그 외에는,
settingConfigFalse 를 false 로 한다.
targetDesc 가 undefined 이면,
extensibleTarget 이 false 이면
TypeError 예외를 발생시킨다.
settingConfigFalse 가 true 이면
TypeError 예외를 발생시킨다.
그 외에는,
IsCompatiblePropertyDescriptor (extensibleTarget ,
Desc , targetDesc )가 false 이면
TypeError 예외를 발생시킨다.
settingConfigFalse 가 true 이고
targetDesc .[[Configurable]] 이
true 이면 TypeError 예외를 발생시킨다.
IsDataDescriptor (targetDesc )
가 true 이고 targetDesc .[[Configurable]] 이 false 이며
targetDesc .[[Writable]] 이
true 이면,
Desc 가 [[Writable]] 필드를 가지고
Desc .[[Writable]] 이
false 이면 TypeError
예외를 발생시킨다.
true 를 반환한다.
참고
프록시 객체의 [[DefineOwnProperty]] 는 다음 불변 조건을 강제합니다:
[[DefineOwnProperty]] 의 결과는 불리언 값이어야
합니다.
타겟 객체가 확장 불가능하면 프로퍼티를 추가할 수 없습니다.
타겟 객체에 해당하는 비구성 가능 자체 프로퍼티가 존재하지 않는 한, 프로퍼티를 비구성 가능으로 만들 수 없습니다.
타겟 객체에 해당하는 비구성 가능, 비쓰기 가능 자체 프로퍼티가 존재하지 않는 한, 비구성 가능 프로퍼티를 비쓰기 가능으로 만들 수 없습니다.
프로퍼티에 해당하는 타겟 객체 프로퍼티가 존재할 때, 그 프로퍼티의 프로퍼티
디스크립터 를 [[DefineOwnProperty]] 로 적용해도
예외가 발생하지 않아야 합니다.
10.5.7 [[HasProperty]] ( P )
프록시 익조틱
객체 O 의 [[HasProperty]] 내부 메서드는 인자
P (프로퍼티
키 )를 받고,
정상 완료 로 불리언을,
혹은 예외 완료 를 반환합니다. 호출 시 다음
단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"has" )로 한다.
trap 이 undefined 이면,
? target .[[HasProperty]] (P )를 반환한다.
booleanTrapResult 를 ToBoolean (? Call (trap , handler , «
target , P »))로 한다.
booleanTrapResult 가 false 이면,
targetDesc 를 ? target .[[GetOwnProperty]] (P )로 한다.
targetDesc 가 undefined 가 아니면,
targetDesc .[[Configurable]] 이
false 이면 TypeError
예외를 발생시킨다.
extensibleTarget 를 ? IsExtensible (target )로
한다.
extensibleTarget 이 false 이면
TypeError 예외를 발생시킨다.
booleanTrapResult 를 반환한다.
참고
프록시 객체의 [[HasProperty]] 는 다음 불변 조건을 강제합니다:
[[HasProperty]] 의 결과는 불리언 값이어야
합니다.
타겟 객체에 비구성 가능 자체 프로퍼티가 존재할 때, 해당 프로퍼티는 존재하지 않는 것으로 보고될 수 없습니다.
타겟 객체가 확장 불가능하고 해당 프로퍼티가 자체 프로퍼티로 존재할 때, 해당 프로퍼티는 존재하지 않는 것으로 보고될 수 없습니다.
10.5.8 [[Get]] ( P ,
Receiver )
프록시 익조틱
객체
O 의 [[Get]] 내부 메서드는 인자 P (프로퍼티 키 )와
Receiver (ECMAScript 언어 값 )를 받고,
정상 완료 로 ECMAScript 언어 값 을,
혹은 예외 완료 를 반환합니다. 호출 시 다음
단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"get" )로 한다.
trap 이 undefined 이면,
? target .[[Get]] (P , Receiver )를
반환한다.
trapResult 를 ? Call (trap ,
handler , « target , P , Receiver »)로 한다.
targetDesc 를 ? target .[[GetOwnProperty]] (P )로 한다.
targetDesc 가 undefined 가 아니고
targetDesc .[[Configurable]] 이
false 이면,
IsDataDescriptor (targetDesc )
가 true 이고 targetDesc .[[Writable]] 이 false 이면,
SameValue (trapResult ,
targetDesc .[[Value]] )가
false 이면 TypeError
예외를 발생시킨다.
IsAccessorDescriptor (targetDesc )
가 true 이고 targetDesc .[[Get]] 이 undefined 이면,
trapResult 가 undefined 가 아니면
TypeError 예외를 발생시킨다.
trapResult 를 반환한다.
참고
프록시 객체의 [[Get]] 는 다음 불변 조건을 강제합니다:
비쓰기 가능, 비구성 가능 자체 데이터 프로퍼티 의 경우, 해당 프로퍼티에 대해 보고되는 값은 타겟
객체 프로퍼티의 값과 같아야 합니다.
접근자
프로퍼티 이면서 [[Get]] 속성이
undefined 인 비구성 가능 자체 프로퍼티의 경우, 해당 프로퍼티에 대해 보고되는 값은
undefined 여야 합니다.
10.5.9 [[Set]] ( P ,
V , Receiver )
프록시 익조틱
객체
O 의 [[Set]] 내부 메서드는 P (프로퍼티 키 ),
V (ECMAScript 언어 값 ),
Receiver (ECMAScript 언어 값 )을 인자로 받고, 불리언을 포함하는 정상 완료 또는
예외 완료 를 반환합니다. 호출 시 다음
단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"set" )로 한다.
trap 이 undefined 이면,
? target .[[Set]] (P , V ,
Receiver )를 반환한다.
booleanTrapResult 를 ToBoolean (? Call (trap , handler , «
target , P , V , Receiver »))로 한다.
booleanTrapResult 가 false 이면 false 를 반환한다.
targetDesc 를 ? target .[[GetOwnProperty]] (P )로 한다.
targetDesc 가 undefined 가 아니고
targetDesc .[[Configurable]] 가
false 이면,
IsDataDescriptor (targetDesc )
가 true 이고 targetDesc .[[Writable]] 이 false 이면,
SameValue (V ,
targetDesc .[[Value]] )가
false 이면 TypeError 예외를 발생시킨다.
IsAccessorDescriptor (targetDesc )
가 true 이면,
targetDesc .[[Set]] 이
undefined 이면 TypeError 예외를 발생시킨다.
true 를 반환한다.
참고
프록시 객체의 [[Set]] 는 다음 불변 조건을 강제합니다:
[[Set]] 의 결과는 불리언 값이어야
합니다.
타겟 객체의 해당 프로퍼티가 비가변(non-configurable) 및 비가변(non-writable) 자체 데이터
프로퍼티 인 경우, 해당 프로퍼티의 값을 타겟 객체의 값과 다르게 변경할 수 없습니다.
타겟 객체의 해당 프로퍼티가 비가변(non-configurable) 자체 접근자 프로퍼티 이고, 그 [[Set]] 속성이 undefined 인 경우 해당 프로퍼티 값을 설정할
수 없습니다.
10.5.10 [[Delete]] ( P )
프록시 익조틱
객체 O 의 [[Delete]] 내부 메서드는
P (프로퍼티
키 )를 인자로 받고, 불리언을 포함하는 정상
완료 또는 예외 완료 를
반환합니다. 호출 시 다음 단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"deleteProperty" )로 한다.
trap 이 undefined 이면,
? target .[[Delete]] (P )를 반환한다.
booleanTrapResult 를 ToBoolean (? Call (trap , handler , «
target , P »))로 한다.
booleanTrapResult 가 false 이면 false 를 반환한다.
targetDesc 를 ? target .[[GetOwnProperty]] (P )로 한다.
targetDesc 가 undefined 이면 true 를 반환한다.
targetDesc .[[Configurable]] 이
false 이면 TypeError 예외를 발생시킨다.
extensibleTarget 를 ? IsExtensible (target )로 한다.
extensibleTarget 이 false 이면 TypeError 예외를
발생시킨다.
true 를 반환한다.
참고
프록시 객체의 [[Delete]] 는 다음 불변 조건을 강제합니다:
[[Delete]] 의 결과는 불리언 값입니다.
타겟 객체에 비가변(non-configurable) 자체 프로퍼티로 존재하는 경우, 해당 프로퍼티가 삭제된 것으로 보고할 수 없습니다.
타겟 객체에 자체 프로퍼티로 존재하고, 타겟 객체가 비확장 가능(non-extensible)한 경우, 해당 프로퍼티가 삭제된 것으로 보고할 수
없습니다.
10.5.11 [[OwnPropertyKeys]] ( )
프록시 익조틱
객체 O 의 [[OwnPropertyKeys]] 내부 메서드는 인자를
받지 않으며, 프로퍼티 키들의 List 를 포함하는 정상
완료 또는 예외 완료 를
반환합니다. 호출 시 다음 단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"ownKeys" )로 한다.
trap 이 undefined 이면,
? target .[[OwnPropertyKeys]] () 를 반환한다.
trapResultArray 를 ? Call (trap ,
handler , « target »))로 한다.
trapResult 를 ? CreateListFromArrayLike (trapResultArray ,
property-key )로 한다.
trapResult 가 중복 항목을 포함하면 TypeError 예외를 발생시킨다.
extensibleTarget 를 ? IsExtensible (target )로 한다.
targetKeys 를 ? target .[[OwnPropertyKeys]] () 로 한다.
Assert :
targetKeys 는 프로퍼티 키들의
List 이다.
Assert :
targetKeys 는 중복 항목을 포함하지 않는다.
targetConfigurableKeys 를 새로운 빈 List 로 한다.
targetNonconfigurableKeys 를 새로운 빈 List 로 한다.
targetKeys 의 각 요소 key 에 대해, 다음을 수행한다:
desc 를 ? target .[[GetOwnProperty]] (key )로 한다.
desc 가 undefined 가 아니고 desc .[[Configurable]] 가 false 이면,
key 를 targetNonconfigurableKeys 에 추가한다.
그 외에는,
key 를 targetConfigurableKeys 에 추가한다.
extensibleTarget 이 true 이고
targetNonconfigurableKeys 가 비어 있으면,
trapResult 를 반환한다.
uncheckedResultKeys 를 trapResult 의 요소들로 이루어진 List 로 한다.
targetNonconfigurableKeys 의 각 요소 key 에 대해, 다음을 수행한다:
uncheckedResultKeys 에 key 가 없으면 TypeError
예외를 발생시킨다.
key 를 uncheckedResultKeys 에서 제거한다.
extensibleTarget 이 true 이면 trapResult 를 반환한다.
targetConfigurableKeys 의 각 요소 key 에 대해, 다음을 수행한다:
uncheckedResultKeys 에 key 가 없으면 TypeError
예외를 발생시킨다.
key 를 uncheckedResultKeys 에서 제거한다.
uncheckedResultKeys 가 비어 있지 않으면 TypeError 예외를 발생시킨다.
trapResult 를 반환한다.
참고
프록시 객체의 [[OwnPropertyKeys]] 는 다음 불변 조건을 강제합니다:
[[OwnPropertyKeys]] 의 결과는 List 입니다.
반환된 List 에는 중복 항목이
없어야 합니다.
반환된 List 의 각 요소는
프로퍼티
키 여야 합니다.
결과 List 에는 타겟 객체의
모든 비가변 자체 프로퍼티의 키가 포함되어야 합니다.
타겟 객체가 비확장 가능(non-extensible)한 경우, 결과 List 에는 타겟 객체의
모든 자체 프로퍼티의 키만 포함되어야 하며, 다른 값은 포함될 수 없습니다.
10.5.12 [[Call]] ( thisArgument ,
argumentsList )
프록시 익조틱
객체
O 의 [[Call]] 내부 메서드는 thisArgument (ECMAScript 언어 값 ),
argumentsList (ECMAScript 언어 값들의
List )를 인자로 받고, ECMAScript 언어 값을 포함하는 정상
완료 또는 예외 완료 를
반환합니다. 호출 시 다음 단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"apply" )로 한다.
trap 이 undefined 이면,
? Call (target ,
thisArgument , argumentsList )를 반환한다.
argArray 를 CreateArrayFromList (argumentsList )로
한다.
? Call (trap , handler , «
target , thisArgument , argArray »)를 반환한다.
참고
프록시
익조틱 객체 는 [[ProxyTarget]] 내부 슬롯의 초기 값이
[[Call]] 내부 메서드를 가진 객체인 경우에만 [[Call]]
내부 메서드를 가집니다.
10.5.13 [[Construct]] (
argumentsList , newTarget )
프록시 익조틱
객체 O 의 [[Construct]] 내부 메서드는
argumentsList (ECMAScript 언어 값들의
List ), newTarget (생성자 )를 인자로 받고, 객체를 포함하는 정상 완료 또는
예외 완료 를 반환합니다. 호출 시 다음
단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
Assert :
IsConstructor (target )가
true 임을 확인한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"construct" )로 한다.
trap 이 undefined 이면,
? Construct (target ,
argumentsList , newTarget )를 반환한다.
argArray 를 CreateArrayFromList (argumentsList )로
한다.
newObj 를 ? Call (trap , handler , «
target , argArray , newTarget »)로 한다.
newObj 가 객체가 아니면 TypeError 예외를
발생시킨다.
newObj 를 반환한다.
참고 1
프록시
익조틱 객체 는 [[ProxyTarget]] 내부 슬롯의 초기 값이
[[Construct]] 내부 메서드를 가진 객체인 경우에만 [[Construct]] 내부 메서드를 가집니다.
참고 2
프록시 객체의 [[Construct]] 는 다음 불변 조건을 강제합니다:
[[Construct]] 의 결과는 반드시 객체여야 합니다.
10.5.14 ValidateNonRevokedProxy ( proxy )
추상 연산 ValidateNonRevokedProxy는 인자 proxy (프록시 익조틱 객체 )를 받고, unused를 포함하는 정상 완료 또는
예외 완료 를 반환합니다.
proxy 가 해제(revoked)된 경우 TypeError 예외를 발생시킵니다. 호출 시 다음 단계를 수행합니다:
proxy .[[ProxyTarget]] 이 null 이면,
TypeError 예외를 발생시킨다.
Assert :
proxy .[[ProxyHandler]] 는 null 이
아니다.
unused 를 반환한다.
10.5.15 ProxyCreate ( target , handler )
추상 연산 ProxyCreate는 인자 target (ECMAScript 언어 값 )과
handler (ECMAScript 언어 값 )를 받고,
프록시 익조틱 객체를 포함하는 정상 완료
또는 예외 완료 를 반환합니다. 새로운 프록시
객체를 생성할 때 사용됩니다. 호출 시 다음 단계를 수행합니다:
target 이 객체가 아니면 , TypeError 예외를
발생시킨다.
handler 가 객체가 아니면 , TypeError 예외를
발생시킨다.
P 를 MakeBasicObject (« [[ProxyHandler]] , [[ProxyTarget]] »)로 한다.
P 의 필수 내부 메서드들([[Call]] 및 [[Construct]] 제외)에 10.5 에
지정된 정의를 설정한다.
IsCallable (target )이
true 이면,
P .[[Call]] 을 10.5.12 에
명시된 대로 설정한다.
IsConstructor (target )
이 true 이면,
P .[[Construct]] 를
10.5.13 에
명시된 대로 설정한다.
P .[[ProxyTarget]] 을 target 으로 설정한다.
P .[[ProxyHandler]] 를 handler 로 설정한다.
P 를 반환한다.
11 ECMAScript 언어: 소스 텍스트
11.1 소스 텍스트
구문
SourceCharacter ::
임의의 유니코드 코드 포인트
ECMAScript 소스 텍스트 는 유니코드 코드 포인트들의 시퀀스이다. U+0000부터 U+10FFFF까지의 모든 유니코드 코드 포인트
값(서러게이트 코드 포인트 포함)은 ECMAScript 문법에서 허용되는 곳에 ECMAScript 소스 텍스트에 나타날 수 있다. ECMAScript 소스 텍스트를 저장하고
교환하는 데 사용되는 실제 인코딩은 이 명세와 관련없다. 외부 소스 텍스트 인코딩과 무관하게, 표준 ECMAScript 구현체는 소스 텍스트를 동등한 SourceCharacter 값들의 시퀀스처럼 처리하며, 각
SourceCharacter 는 유니코드 코드 포인트이다.
표준 ECMAScript 구현체는 소스 텍스트의 정규화(normalization)를 수행하거나, 수행하는 것처럼 동작할 필요가 없다.
조합 문자 시퀀스(combining character sequence)의 구성 요소는 사용자가 전체 시퀀스를 하나의 문자로 인식할 수도 있지만, 각각 개별 유니코드 코드 포인트로
취급된다.
참고
문자열 리터럴, 정규 표현식 리터럴, 템플릿 리터럴, 식별자에서는 어떤 유니코드 코드 포인트도 해당 코드 포인트의 숫자 값을 명시적으로 표현하는 유니코드 이스케이프
시퀀스를 사용하여 나타낼 수 있다. 주석 내에서는 이러한 이스케이프 시퀀스가 주석의 일부로 무시된다.
ECMAScript는 유니코드 이스케이프 시퀀스의 동작에서 Java 프로그래밍 언어와 다르다. 예를 들어, Java 프로그램에서 유니코드 이스케이프 시퀀스
\u000A가 한 줄짜리 주석 내에 나타나면, 이는 줄 종결자(유니코드 코드 포인트 U+000A는 LINE FEED (LF))로 해석되어 다음
코드 포인트는 주석의 일부가 아니다. 마찬가지로, Java 프로그램의 문자열 리터럴 내에 \u000A가 나타나면, 이것도 줄 종결자로 해석되어
문자열 리터럴 내에 허용되지 않는다—문자열 리터럴 값에 LINE FEED (LF)를 포함하려면 \n을 사용해야 한다. ECMAScript
프로그램에서는 주석 내에 등장하는 유니코드 이스케이프 시퀀스가 해석되지 않으므로 주석의 종료에 기여할 수 없다. 또한, ECMAScript 프로그램의 문자열 리터럴
내에 나타나는 유니코드 이스케이프 시퀀스는 항상 리터럴 값에 포함되며, 줄 종결자나 문자열 리터럴을 종료시킬 수 있는 코드 포인트로 해석되지 않는다.
11.1.1 정적 의미: UTF16EncodeCodePoint ( cp )
추상 연산 UTF16EncodeCodePoint는 인자 cp (유니코드 코드 포인트)를 받아 문자열을 반환한다. 호출 시 다음 단계를 수행한다:
Assert : 0 ≤
cp ≤ 0x10FFFF.
cp ≤ 0xFFFF이면, 숫자 값이 cp 인 코드 유닛으로 구성된 문자열 값을 반환한다.
cu1 을 (cp - 0x10000) / 0x400의 내림(floor) 값에 0xD800을 더한 값인 코드 유닛으로
한다.
cu2 를 (cp - 0x10000) modulo 0x400의 값에 0xDC00을 더한 값인 코드 유닛으로 한다.
cu1 과 cu2 를 문자열 연결 하여 반환한다.
11.1.2 정적 의미: CodePointsToString ( text )
추상 연산 CodePointsToString은 인자 text (유니코드 코드 포인트 시퀀스)를 받아 문자열을 반환한다. text 를
6.1.4 에 설명된 대로 문자열 값으로
변환한다. 호출 시 다음 단계를 수행한다:
result 를 빈 문자열로 한다.
text 의 각 코드 포인트 cp 에 대해, 다음을 수행한다:
result 를 result 와 UTF16EncodeCodePoint (cp )의
문자열 연결 로 설정한다.
result 를 반환한다.
11.1.3 정적 의미: UTF16SurrogatePairToCodePoint (
lead , trail )
추상 연산 UTF16SurrogatePairToCodePoint는 인자 lead (코드 유닛), trail (코드 유닛)을 받아 코드
포인트를 반환한다. UTF-16 서러게이트 쌍 을 코드 포인트로 변환한다. 호출 시 다음 단계를 수행한다:
Assert :
lead 는 리딩 서러게이트 이고 trail 은 트레일링
서러게이트 이다.
cp 를 (lead - 0xD800) × 0x400 + (trail - 0xDC00) +
0x10000으로 한다.
코드 포인트 cp 를 반환한다.
11.1.4 정적 의미: CodePointAt ( string ,
position )
추상 연산 CodePointAt은 인자 string (문자열), position (음이 아닌 정수 )를 받아, Record 타입의 [[CodePoint]] (코드 포인트), [[CodeUnitCount]] (양의
정수 ), [[IsUnpairedSurrogate]] (불리언) 필드를 가진 결과를 반환한다. string 을
6.1.4 에 설명된 대로 UTF-16
인코딩 코드 포인트 시퀀스로 해석하고, position 위치의 코드 유닛에서 시작하는 코드 포인트 하나를 읽는다. 호출 시 다음 단계를 수행한다:
size 를 string 의 길이로 한다.
Assert :
position ≥ 0이고 position < size 이다.
first 를 string 내 position 인덱스의 코드 유닛으로 한다.
cp 를 first 의 숫자 값과 동일한 숫자 값을 가지는 코드 포인트로 한다.
first 가 리딩 서러게이트 도 아니고 트레일링
서러게이트 도 아니면,
다음 Record 를
반환한다: {
[[CodePoint]] : cp , [[CodeUnitCount]] : 1, [[IsUnpairedSurrogate]] :
false }.
first 가 트레일링 서러게이트 이거나
position + 1 = size 이면,
다음 Record 를
반환한다: {
[[CodePoint]] : cp , [[CodeUnitCount]] : 1, [[IsUnpairedSurrogate]] : true }.
second 를 string 내 position +1 인덱스의 코드 유닛으로 한다.
second 가 트레일링 서러게이트 가 아니면,
다음 Record 를
반환한다: {
[[CodePoint]] : cp , [[CodeUnitCount]] : 1, [[IsUnpairedSurrogate]] : true }.
cp 를 UTF16SurrogatePairToCodePoint (first ,
second )로 한다.
다음 Record 를 반환한다: {
[[CodePoint]] : cp , [[CodeUnitCount]] : 2, [[IsUnpairedSurrogate]] : false }.
11.1.5 정적 의미: StringToCodePoints ( string )
추상 연산 StringToCodePoints는 인자 string (문자열)을 받아 코드 포인트들의 List 를 반환한다.
string 을 6.1.4 에 설명된 대로 UTF-16
인코딩 유니코드 텍스트로 해석하여 결과로 유니코드 코드 포인트 시퀀스를 반환한다. 호출 시 다음 단계를 수행한다:
codePoints 를 새로운 빈 List 로 한다.
size 를 string 의 길이로 한다.
position 을 0으로 한다.
position < size 인 동안 반복한다:
cp 를 CodePointAt (string ,
position )으로 한다.
cp .[[CodePoint]] 를 codePoints 에
추가한다.
position 을 position + cp .[[CodeUnitCount]] 로 설정한다.
codePoints 를 반환한다.
11.1.6 정적 의미: ParseText ( sourceText ,
goalSymbol )
추상 연산 ParseText는 인자 sourceText (문자열 또는 유니코드 코드 포인트 시퀀스),
goalSymbol (ECMAScript 문법의 비종결 기호(nonterminal))을 받아, 파스 노드(Parse
Node) 또는 비어 있지 않은 List 의
SyntaxError 객체들을 반환한다. 호출 시 다음 단계를 수행한다:
sourceText 가 문자열 이면,
sourceText 를 StringToCodePoints (sourceText )로
설정한다.
goalSymbol 을 목표 심볼(goal symbol) 로 하여
sourceText 를 파싱하고, 파싱 결과에서 조기 에러(early error) 조건을 분석한다. 파싱과 조기 에러 탐지는
구현 정의 방식으로 상호 교차될 수 있다.
파싱이 성공하고 조기
에러 가 발견되지 않았다면, 파싱으로 얻어진 파스 트리의 루트에서 파스
노드 (goalSymbol 의 인스턴스)를 반환한다.
그렇지 않으면, 파싱 오류 및/또는 조기 에러 를 나타내는 하나 이상의
SyntaxError 객체들의 List 를 반환한다. 둘 이상의
파싱 오류 또는 조기
에러 가 있는 경우, 오류 객체의 개수와 순서는 구현
정의 이지만, 하나 이상은 반드시 포함되어야 한다.
참고 1
특정 위치에 조기
에러 가 있고, 이후 위치에 구문 오류가 있는 텍스트를 생각해보자. 파싱 후 조기 에러 탐지
단계를 수행하는 구현체는 구문 오류만 보고하고 조기 에러 탐지를 진행하지 않을 수도 있다. 두 단계를
교차(interleave)하는 구현체는 조기 에러 만 보고하고 구문 오류를 찾지 않을 수도 있다. 세 번째 구현체는 두
에러 모두를 보고할 수도 있다. 이 모든 동작은 적합하다.
참고 2
11.2 소스 코드의 종류
ECMAScript 코드에는 네 가지 종류가 있다:
글로벌 코드 는 ECMAScript Script 로 취급되는 소스 텍스트이다. 특정 Script 의 글로벌 코드에는 FunctionDeclaration , FunctionExpression , GeneratorDeclaration ,
GeneratorExpression ,
AsyncFunctionDeclaration , AsyncFunctionExpression , AsyncGeneratorDeclaration , AsyncGeneratorExpression , MethodDefinition , ArrowFunction , AsyncArrowFunction , ClassDeclaration , 또는 ClassExpression 의 일부로 파싱되는 소스
텍스트는 포함되지 않는다.
Eval 코드 는 내장 eval 함수에 전달된 소스 텍스트이다. 더 정확히 말하면, 내장
eval 함수의 인자가 문자열인 경우 ,
이는 ECMAScript Script 로 취급된다.
eval의 특정 호출에 대한 eval 코드는 해당 Script 의 글로벌 코드 부분이다.
함수 코드 란 ECMAScript 함수 객체 의 [[ECMAScriptCode]] 및 [[FormalParameters]]
내부 슬롯(자세한 내용은 10.2 참조)에 값을 제공하기 위해 파싱되는 소스
텍스트이다. 특정 ECMAScript 함수의 함수 코드에는 중첩된 FunctionDeclaration ,
FunctionExpression ,
GeneratorDeclaration , GeneratorExpression ,
AsyncFunctionDeclaration , AsyncFunctionExpression , AsyncGeneratorDeclaration ,
AsyncGeneratorExpression , MethodDefinition , ArrowFunction , AsyncArrowFunction ,
ClassDeclaration , 또는
ClassExpression 의 함수 코드로
파싱되는 소스 텍스트는 포함하지 않는다.
또한, 위에서 언급한 소스 텍스트가 다음과 같이 파싱되는 경우:
그렇다면 해당 선언 또는 표현식의 BindingIdentifier (있을 경우)가 매치하는 소스 텍스트 도
해당 함수의 함수 코드에 포함된다.
모듈 코드 는 ModuleBody 로 제공되는 코드이다. 모듈이 초기화될 때 직접 평가되는 코드이다. 특정
모듈의 모듈 코드에는 중첩된 FunctionDeclaration , FunctionExpression , GeneratorDeclaration ,
GeneratorExpression ,
AsyncFunctionDeclaration , AsyncFunctionExpression , AsyncGeneratorDeclaration , AsyncGeneratorExpression , MethodDefinition , ArrowFunction , AsyncArrowFunction , ClassDeclaration , 또는 ClassExpression 의 일부로 파싱되는 소스
텍스트는 포함되지 않는다.
참고 1
함수 코드는 일반적으로 함수 정의(15.2 ), 화살표 함수 정의(15.3 ), 메서드 정의(15.4 ), 제너레이터 함수 정의(15.5 ), 비동기 함수 정의(15.8 ), 비동기 제너레이터 함수
정의(15.6 ), 비동기 화살표
함수(15.9 )의 본문으로 제공된다. 함수 코드는
Function 생성자 (20.2.1.1 ),
GeneratorFunction 생성자 (27.3.1.1 ), AsyncFunction
생성자 (27.7.1.1 ),
AsyncGeneratorFunction 생성자 (27.4.1.1 )의 인자에서도
유도된다.
참고 2
함수 코드에 BindingIdentifier 가 포함되는 실질적인 효과는,
엄격 모드
코드(strict mode code) 에 대한 조기 에러(Early Errors)가 "use strict" 지시문이 본문에
포함된 함수의 이름이 되는 BindingIdentifier 에도 적용된다는 것이다. 이때 바깥쪽
코드는 엄격
모드 코드 가 아닐 수 있다.
11.2.1 지시문 프롤로그와 use strict 지시문
지시문 프롤로그 는 ExpressionStatement 들이
StatementListItem 또는
ModuleItem 의 처음에 연속적으로 등장하는 가장 긴
시퀀스로, FunctionBody , ScriptBody , ModuleBody 의 선두에 위치한다. 이 시퀀스의 각
ExpressionStatement 는
오로지 StringLiteral 토큰과 세미콜론으로만
구성되어야 한다. 세미콜론은 명시적으로 존재할 수도 있고, 자동 세미콜론 삽입(12.10 )에 의해 삽입될 수도
있다. 지시문
프롤로그 는 빈 시퀀스일 수도 있다.
use strict
지시문 은 지시문 프롤로그 내의 ExpressionStatement 중에서, StringLiteral 이 정확히
"use strict" 또는 'use strict' 코드 포인트 시퀀스와 일치하는 것이다. use strict
지시문 에는 EscapeSequence 나 LineContinuation 가 포함될 수 없다.
지시문
프롤로그 에는 둘 이상의 use strict 지시문 이 포함될 수 있다. 그러나, 구현체는 이러한 경우
경고를 표시할 수 있다.
참고
지시문
프롤로그 의 ExpressionStatement 들은 포함한 프로덕션이
평가될 때 정상적으로 평가된다. 구현체는 지시문 프롤로그 내에 존재하지만 use
strict 지시문 이 아닌 ExpressionStatement 에 대해 구현 정의의 의미를
부여할 수 있다. 적절한 알림 메커니즘이 존재한다면, 구현체는 지시문 프롤로그 내에서 구현에서 정의된
의미가 없는 use strict 지시문 이 아닌 ExpressionStatement 을 만났을 때 경고를
표시해야 한다.
11.2.2 엄격 모드 코드(Strict Mode Code)
ECMAScript 구문 단위는 제한 없는 모드 또는 엄격 모드 문법 및 의미론(4.3.2 )으로 처리될 수 있다.
다음과 같은 상황에서 코드는 엄격 모드 코드 로 해석된다:
글로벌 코드 가 지시문
프롤로그 로 시작하고, 그 안에 use strict 지시문 이 포함되어 있다면,
해당 코드는 엄격 모드 코드이다.
모듈 코드 는 항상 엄격 모드 코드이다.
ClassDeclaration 이나
ClassExpression 의 모든 부분은
엄격 모드 코드이다.
Eval 코드 가 지시문
프롤로그 로 시작하고, 그 안에 use strict 지시문 이 있거나,
eval 호출이 직접 eval(direct
eval) 이고, 해당 호출이 엄격 모드 코드 내에 있을 때, Eval 코드는 엄격 모드 코드이다.
함수 코드 가 연관된 FunctionDeclaration ,
FunctionExpression ,
GeneratorDeclaration , GeneratorExpression ,
AsyncFunctionDeclaration , AsyncFunctionExpression , AsyncGeneratorDeclaration ,
AsyncGeneratorExpression , MethodDefinition , ArrowFunction , 또는 AsyncArrowFunction 이 엄격
모드 코드 내에 포함되어 있거나, 함수의 [[ECMAScriptCode]] 내부 슬롯 값이 생성되는 코드는
지시문
프롤로그 로 시작하고, 그 안에 use strict 지시문 이 포함되어 있다면,
해당 함수 코드는 엄격 모드 코드이다.
내장 Function, Generator, AsyncFunction, AsyncGenerator 생성자 에 인자로 제공되는 함수
코드 의 마지막 인자가 문자열 이고, 이를 처리하면
FunctionBody 가 되고, 이
FunctionBody 가 지시문
프롤로그 로 시작하며, 그 안에 use strict 지시문 이 포함되어 있다면,
해당 함수 코드는 엄격 모드 코드이다.
엄격 모드 코드가 아닌 ECMAScript 코드는 비엄격(non-strict) 코드 라고
한다.
11.2.2.1 정적 의미: IsStrict ( node )
추상 연산 IsStrict는 인자 node (파스 노드(Parse Node) )를 받아 불리언을 반환한다. 호출 시
다음 단계를 수행한다:
node가 매칭한 소스
텍스트 가 엄격 모드 코드 이면
true 를 반환하고, 그렇지 않으면 false 를 반환한다.
11.2.3 비-ECMAScript 함수
ECMAScript 구현체는 실행 동작이 호스트
정의 실행 코드 형태로 표현되는 함수 익조틱 객체 의 평가를 지원할 수 있다. 함수 객체 가
ECMAScript 코드 내에서 정의되었는지, 내장 함수인지는 그러한 함수 객체 를 호출하거나, 그에 의해 호출되는 ECMAScript 코드의 관점에서는 관찰할
수 없다.
12 ECMAScript 언어: 렉시컬 문법
ECMAScript Script 또는
Module 의 소스 텍스트는 먼저 입력 요소들의 시퀀스로 변환된다. 입력 요소란
토큰, 줄 종결자, 주석, 또는 공백이다. 소스 텍스트는 왼쪽에서 오른쪽으로 스캔되며, 가능한 한 가장 긴 코드 포인트 시퀀스를 다음 입력 요소로 반복적으로 선택한다.
렉시컬 입력 요소의 식별은 입력 요소를 소비하는 구문 문법 컨텍스트에 따라 민감하게 달라지는 여러 상황이 있다. 이는 렉시컬 문법에 여러 목표
심볼 이 필요함을 의미한다. InputElementHashbangOrRegExp 목표는 Script 또는 Module 의 시작 부분에서 사용된다. InputElementRegExpOrTemplateTail 목표는
RegularExpressionLiteral ,
TemplateMiddle , 또는 TemplateTail 이 허용되는 구문 문법 컨텍스트에서 사용된다.
InputElementRegExp 목표
심볼 은 RegularExpressionLiteral 이 허용되지만 TemplateMiddle 또는 TemplateTail 은 허용되지 않는 모든 구문 문법 컨텍스트에서
사용된다. InputElementTemplateTail 목표는 TemplateMiddle 또는 TemplateTail 이 허용되고 RegularExpressionLiteral 은 허용되지
않는 모든 구문 문법 컨텍스트에서 사용된다. 그 외의 모든 컨텍스트에서는 InputElementDiv 가 렉시컬 목표
심볼 로 사용된다.
참고
여러 렉시컬 목표를 사용하는 것은 자동 세미콜론 삽입에 영향을 줄 수 있는 렉시컬 모호성이 없도록 보장한다. 예를 들어, 선행하는 나눗셈 또는 나눗셈 할당과 선행하는
RegularExpressionLiteral 이 모두 허용되는 구문
문법 컨텍스트는 없다. 이것은 세미콜론 삽입(자세한 내용은 12.10 참고)에 영향을 받지
않는다. 예를 들어 다음과 같은 경우:
a = b
/hi/g.exec (c).map (d);
여기서 LineTerminator 뒤의 첫 번째
공백·주석이 아닌 코드 포인트가 U+002F(SOLIDUS)이고, 구문 컨텍스트가 나눗셈 또는 나눗셈 할당을 허용한다면, 해당 LineTerminator 위치에 세미콜론이 삽입되지
않는다. 즉, 위의 예시는 다음과 동일하게 해석된다:
a = b / hi / g.exec (c).map (d);
구문
InputElementDiv ::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
RightBracePunctuator
InputElementRegExp ::
WhiteSpace
LineTerminator
Comment
CommonToken
RightBracePunctuator
RegularExpressionLiteral
InputElementRegExpOrTemplateTail
::
WhiteSpace
LineTerminator
Comment
CommonToken
RegularExpressionLiteral
TemplateSubstitutionTail
InputElementTemplateTail
::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
TemplateSubstitutionTail
InputElementHashbangOrRegExp
::
WhiteSpace
LineTerminator
Comment
CommonToken
HashbangComment
RegularExpressionLiteral
12.1 유니코드 형식 제어 문자
유니코드 형식 제어 문자(즉, 유니코드 문자 데이터베이스에서 “Cf” 범주에 속하는 문자들, 예: LEFT-TO-RIGHT MARK 또는 RIGHT-TO-LEFT MARK)는 상위
수준의 프로토콜(마크업 언어 등)이 없는 경우에 텍스트 범위의 서식을 제어하는 데 사용되는 제어 코드입니다.
편집과 표시를 용이하게 하기 위해 소스 텍스트에 형식 제어 문자를 허용하는 것이 유용합니다. 모든 형식 제어 문자는 주석, 문자열 리터럴, 템플릿 리터럴, 정규 표현식 리터럴 내에서
사용할 수 있습니다.
U+FEFF(ZERO WIDTH NO-BREAK SPACE)는 주로 텍스트의 시작 부분에서 유니코드임을 표시하고 텍스트의 인코딩과 바이트 순서를 감지할 수 있도록 하는 형식 제어
문자입니다.
이러한 목적을 가진 <ZWNBSP> 문자는 파일을 연결(concatenate)하는 등의 작업 결과로 텍스트의 시작 이후에도 나타날 수 있습니다. ECMAScript 소스
텍스트 에서 <ZWNBSP> 코드 포인트는 주석, 문자열 리터럴, 템플릿 리터럴, 정규 표현식 리터럴 외부에서는 공백 문자로
취급됩니다(자세한 내용은 12.2 참고).
12.2 공백(White Space)
공백 코드 포인트는 소스 텍스트의 가독성을 높이고, 토큰(분할 불가능한 렉시컬 단위)들 사이를 구분하는 데 사용되지만, 그 외에는 의미가 없습니다. 공백 코드 포인트는 어떤 두 토큰
사이에도, 입력의 시작이나 끝에도 올 수 있습니다. 공백 코드 포인트는 StringLiteral ,
RegularExpressionLiteral , Template , TemplateSubstitutionTail 내에도 등장할 수 있으며, 이
경우에는 리터럴 값의 일부를 이루는 의미 있는 코드 포인트로 간주됩니다. 또한 Comment 내에도 등장할 수 있지만, 다른 종류의 토큰 내에는 등장할 수 없습니다.
ECMAScript에서의 공백 코드 포인트는 표 35 에 나열되어 있습니다.
표 35: 공백 코드 포인트
코드 포인트
이름
약어
U+0009
CHARACTER TABULATION
<TAB>
U+000B
LINE TABULATION
<VT>
U+000C
FORM FEED (FF)
<FF>
U+FEFF
ZERO WIDTH NO-BREAK SPACE
<ZWNBSP>
일반 범주 “Space_Separator”의 임의의 코드 포인트
<USP>
참고 1
U+0020(SPACE) 및 U+00A0(NO-BREAK SPACE) 코드 포인트는 <USP>에 포함됩니다.
참고 2
표 35 에 나열된 코드 포인트 외에는,
ECMAScript WhiteSpace 는 유니코드
“White_Space” 속성을 가진 코드 포인트 중 일반 범주 “Space_Separator”(“Zs”)로 분류되지 않은 모든 코드 포인트를 의도적으로 제외합니다.
구문
WhiteSpace ::
<TAB>
<VT>
<FF>
<ZWNBSP>
<USP>
12.3 줄 종결자(Line Terminators)
공백 코드 포인트와 마찬가지로, 줄 종결자 코드 포인트도 소스 텍스트의 가독성을 높이고, 토큰(분할 불가능한 렉시컬 단위) 사이를 구분하는 데 사용됩니다. 하지만 공백 코드 포인트와
달리, 줄 종결자는 구문 문법의 동작에 일부 영향을 미칩니다. 일반적으로 줄 종결자는 어떤 두 토큰 사이에도 올 수 있지만, 구문 문법에 의해 금지되는 위치도 일부 있습니다. 줄
종결자는 자동 세미콜론 삽입(12.10 ) 과정에도 영향을 미칩니다. 줄 종결자는
StringLiteral , Template , TemplateSubstitutionTail 토큰 이외의 어떤 토큰 내에도
올 수 없습니다. <LF>와 <CR> 줄 종결자는 StringLiteral 토큰 내에 LineContinuation 의 일부로 나타나는 경우를 제외하고는 올 수 없습니다.
줄 종결자는 MultiLineComment 내에는 올 수
있지만, SingleLineComment 내에는 올
수 없습니다.
줄 종결자는 정규 표현식에서 \s 클래스에 의해 매칭되는 공백 코드 포인트 집합에 포함됩니다.
ECMAScript의 줄 종결자 코드 포인트들은 표 36 에 나열되어 있습니다.
표 36: 줄 종결자 코드 포인트
코드 포인트
유니코드 이름
약어
U+000A
LINE FEED (LF)
<LF>
U+000D
CARRIAGE RETURN (CR)
<CR>
U+2028
LINE SEPARATOR
<LS>
U+2029
PARAGRAPH SEPARATOR
<PS>
표 36 에 있는 유니코드 코드 포인트만 줄 종결자로 취급됩니다.
다른 줄 바꿈 또는 줄 나눔 유니코드 코드 포인트는 줄 종결자로 취급되지 않으며, 표 35 의 조건을 만족하는 경우에만 공백으로
취급됩니다. <CR><LF> 시퀀스는 줄 종결자로 자주 사용됩니다. 이는 줄 번호를 보고(report)할 때 하나의 SourceCharacter 로 간주되어야 합니다.
구문
LineTerminator ::
<LF>
<CR>
<LS>
<PS>
LineTerminatorSequence
::
<LF>
<CR>
[lookahead ≠ <LF> ]
<LS>
<PS>
<CR>
<LF>
12.5 해시뱅 주석(Hashbang Comments)
해시뱅 주석은 위치에 민감하며, 다른 주석과 마찬가지로 구문 문법의 입력 요소 스트림에서 버려집니다.
구문
12.6 토큰
구문
CommonToken ::
IdentifierName
PrivateIdentifier
Punctuator
NumericLiteral
StringLiteral
Template
참고
12.7 이름과 키워드
IdentifierName 과 ReservedWord 는 Unicode Standard Annex
#31, Identifier and Pattern Syntax에 명시된 기본 식별자 문법(Default Identifier Syntax)을 약간 수정하여 해석되는 토큰입니다.
ReservedWord 는 IdentifierName 의 열거된 부분집합입니다. 구문 문법은
Identifier 를 IdentifierName 이면서 ReservedWord 가 아닌 것으로 정의합니다. 유니코드 식별자
문법은 유니코드 표준에 명시된 문자 속성을 기반으로 합니다. 최신 버전의 유니코드 표준에서 지정된 범주의 유니코드 코드 포인트는 모든 호환 ECMAScript 구현체에서 해당
범주로 다뤄져야 합니다. ECMAScript 구현체는 이후 유니코드 표준 버전에 정의된 식별자 코드 포인트도 인식할 수 있습니다.
참고 1
이 표준은 다음의 특정 코드 포인트를 추가로 허용합니다: U+0024(DOLLAR SIGN)와 U+005F(LOW LINE)은 IdentifierName 어디에서든 사용할 수
있습니다.
구문
PrivateIdentifier ::
#
IdentifierName
IdentifierName ::
IdentifierStart
IdentifierName
IdentifierPart
IdentifierStart ::
IdentifierStartChar
\
UnicodeEscapeSequence
IdentifierPart ::
IdentifierPartChar
\
UnicodeEscapeSequence
IdentifierStartChar
::
UnicodeIDStart
$
_
IdentifierPartChar ::
UnicodeIDContinue
$
AsciiLetter ::
one of a b c
d e f g h
i j k l m
n o p q r
s t u v w
x y z A B
C D E F G
H I J K L
M N O P Q
R S T U V
W X Y Z
UnicodeIDStart ::
유니코드 속성 “ID_Start”를 가진 임의의 유니코드 코드 포인트
UnicodeIDContinue ::
유니코드 속성 “ID_Continue”를 가진 임의의 유니코드 코드 포인트
비종결 기호 UnicodeEscapeSequence 의 정의는 12.9.4 에 나와 있습니다.
참고 2
참고 3
유니코드 속성 “ID_Start” 및 “ID_Continue”를 가진 코드 포인트 집합에는 각각 “Other_ID_Start” 및 “Other_ID_Continue”
속성을 가진 코드 포인트도 포함됩니다.
12.7.1 식별자 이름
IdentifierName 내에는 유니코드 이스케이프
시퀀스를 사용할 수 있으며, 이 경우 해당 시퀀스는 UnicodeEscapeSequence 의 IdentifierCodePoint 와 동일한 하나의 유니코드 코드 포인트를
기여합니다. UnicodeEscapeSequence 앞의 \는
코드 포인트에 기여하지 않습니다. UnicodeEscapeSequence 는, 그렇지 않으면 유효하지 않은
IdentifierName 에 코드 포인트를 기여하는
데 사용할 수 없습니다. 즉, \ UnicodeEscapeSequence 시퀀스를 해당하는 SourceCharacter 로 대체해도, 결과가 여전히
동일한 IdentifierName 의 정확히 동일한
SourceCharacter 시퀀스가 되어야
합니다. 이 명세 내의 IdentifierName
해석은, 이스케이프 시퀀스가 특정 코드 포인트에 기여했는지 여부와 관계없이 실제 코드 포인트를 기반으로 합니다.
유니코드 표준에 따라 정규적으로 동등한 두 IdentifierName 은, 각 UnicodeEscapeSequence 를 대체한 후에 코드 포인트의
정확히 동일한 시퀀스로 표현되지 않는 한, 동일하지 않습니다 .
12.7.1.1 정적 의미: 조기 에러(Early Errors)
IdentifierStart
::
\
UnicodeEscapeSequence
IdentifierPart ::
\
UnicodeEscapeSequence
12.7.1.2 정적 의미: IdentifierCodePoints
구문-지향 연산
IdentifierCodePoints는 인자를 받지 않으며, 코드 포인트들의 List 를 반환합니다. 다음 생성규칙들에
대해 부분적으로 정의됩니다:
IdentifierName ::
IdentifierStart
cp 를 IdentifierStart 의 IdentifierCodePoint 로 한다.
« cp »를 반환한다.
IdentifierName ::
IdentifierName
IdentifierPart
cps 를 파생된 IdentifierName 의 IdentifierCodePoints 로 한다.
cp 를 IdentifierPart 의 IdentifierCodePoint 로 한다.
cps 와 « cp »의 리스트 연결 을 반환한다.
12.7.1.3 정적 의미: IdentifierCodePoint
구문-지향 연산
IdentifierCodePoint는 인자를 받지 않으며, 코드 포인트를 반환합니다. 다음 생성규칙들에 대해 부분적으로 정의됩니다:
IdentifierStart
:: IdentifierStartChar
IdentifierStartChar 가 매칭한 코드
포인트를 반환한다.
IdentifierPart ::
IdentifierPartChar
IdentifierPartChar 가 매칭한 코드 포인트를
반환한다.
UnicodeEscapeSequence
::
u
Hex4Digits
Hex4Digits 의 MV와 동일한
숫자 값을 가지는 코드 포인트를 반환한다.
UnicodeEscapeSequence
::
u{
CodePoint
}
CodePoint 의 MV와 동일한 숫자
값을 가지는 코드 포인트를 반환한다.
12.7.2 키워드와 예약어
키워드 는 IdentifierName 과 일치하지만, 구문적으로 사용되는 토큰입니다. 즉, 구문
생성규칙에서 고정폭(fixed width) 글꼴로 문자 그대로 등장합니다. ECMAScript의 키워드에는 if,
while, async, await 등 여러 가지가 있습니다.
예약어 는 식별자로 사용할 수 없는 IdentifierName 입니다. 많은 키워드가 예약어이지만, 일부는 아니기도 하며,
일부는 특정 컨텍스트에서만 예약어입니다. if와 while은 예약어입니다. await는 async
함수와 모듈 내에서만 예약어입니다. async는 예약어가 아니며, 변수명이나 statement label로 자유롭게 사용할 수 있습니다.
이 명세는 문법 생성규칙과 조기
에러 규칙의 조합으로 어떤 이름이 유효한 식별자인지, 어떤 이름이 예약어인지 명시합니다. 아래 ReservedWord 목록의 모든 토큰(단,
await와 yield는 제외)은 무조건적으로 예약어입니다. await와
yield의 예외는 13.1 에서 파라미터화된 구문 생성규칙을 통해 명시됩니다. 마지막으로, 여러
조기 에러 규칙이 유효한
식별자의 집합을 제한합니다. 자세한 내용은 13.1.1 , 14.3.1.1 ,
14.7.5.1 ,
15.7.1 참고.
요약하면, 식별자 이름에는 다섯 가지 범주가 있습니다:
항상 식별자로 허용되고 키워드가 아닌 것들(Math, window, toString,
_ 등)
식별자로 절대 허용되지 않는 것들(아래 ReservedWord 목록 중 await와
yield를 제외한 것들)
컨텍스트에 따라 식별자로 허용되는 것들(await와 yield)
엄격
모드 코드 에서 컨텍스트에 따라 식별자로 허용되지 않는 것들: let,
static, implements, interface,
package, private, protected, public
항상 식별자로 허용되지만, 특정 구문 생성규칙 내에서 Identifier 가 허용되지 않는 위치에서 키워드로도 등장하는
것들(as, async, from, get,
meta, of, set, target)
조건부 키워드 또는 컨텍스트 키워드 라는 용어는 마지막 세 범주에 속하는 키워드들을 일컫기도
하며, 이들은 어떤 컨텍스트에서는 식별자로, 어떤 컨텍스트에서는 키워드로 사용될 수 있습니다.
구문
ReservedWord ::
one of await break
case catch class const
continue debugger default
delete do else enum
export extends false finally
for function if import
in instanceof new null
return super switch this
throw true try typeof
var void while with
yield
참고 1
5.1.5 에 따라, 문법의 키워드는 특정 SourceCharacter 시퀀스에 문자
그대로 매칭됩니다. 키워드 내의 코드 포인트는 \ UnicodeEscapeSequence 로 표현될 수
없습니다.
IdentifierName 내에는
\ UnicodeEscapeSequence 를 포함할 수
있지만, els\u{65}와 같이 "else"라는 이름의 변수를 선언할 수는 없습니다. 조기 에러 규칙은
13.1.1 에서
예약어와 StringValue 가 같은 식별자를
금지합니다.
참고 2
enum은 현재 이 명세에서 키워드로 사용되지 않습니다. 이는 미래의 예약어 (future reserved word)로,
향후 언어 확장을 위해 예약되어 있습니다.
마찬가지로 implements, interface, package,
private, protected, public도 엄격 모드
코드 내에서 미래의 예약어입니다.
참고 3
arguments와 eval은 키워드는 아니지만, 엄격 모드
코드 내에서는 일부 제한을 받습니다. 자세한 내용은 13.1.1 ,
8.6.4 ,
15.2.1 ,
15.5.1 ,
15.6.1 ,
15.8.1 를
참고하세요.
12.8 구두점(Punctuators)
구문
Punctuator ::
OptionalChainingPunctuator
OtherPunctuator
OptionalChainingPunctuator
::
?.
[lookahead ∉ DecimalDigit ]
OtherPunctuator ::
one of { ( )
[ ] . ... ;
, < > <=
>= == != ===
!== + - * %
** ++ -- <<
>> >>> & |
^ ! ~ &&
|| ?? ? : =
+= -= *= %= **=
<<= >>= >>>=
&= |= ^= &&=
||= ??= =>
DivPunctuator ::
/
/=
RightBracePunctuator
::
}
12.9 리터럴
12.9.1 Null 리터럴
구문
NullLiteral ::
null
12.9.2 불리언 리터럴
구문
BooleanLiteral ::
true
false
12.9.3 숫자 리터럴
구문
NumericLiteralSeparator
::
_
NumericLiteral ::
DecimalLiteral
DecimalBigIntegerLiteral
NonDecimalIntegerLiteral [+Sep]
NonDecimalIntegerLiteral [+Sep]
BigIntLiteralSuffix
LegacyOctalIntegerLiteral
DecimalBigIntegerLiteral
::
0
BigIntLiteralSuffix
NonZeroDigit
DecimalDigits [+Sep] opt
BigIntLiteralSuffix
NonZeroDigit
NumericLiteralSeparator
DecimalDigits [+Sep]
BigIntLiteralSuffix
NonDecimalIntegerLiteral [Sep]
::
BinaryIntegerLiteral [?Sep]
OctalIntegerLiteral [?Sep]
HexIntegerLiteral [?Sep]
BigIntLiteralSuffix
::
n
DecimalLiteral ::
DecimalIntegerLiteral
.
DecimalDigits [+Sep] opt
ExponentPart [+Sep] opt
.
DecimalDigits [+Sep]
ExponentPart [+Sep] opt
DecimalIntegerLiteral
ExponentPart [+Sep] opt
DecimalIntegerLiteral
::
0
NonZeroDigit
NonZeroDigit
NumericLiteralSeparator opt
DecimalDigits [+Sep]
NonOctalDecimalIntegerLiteral
DecimalDigits [Sep]
::
DecimalDigit
DecimalDigits [?Sep]
DecimalDigit
[+Sep]
DecimalDigits [+Sep]
NumericLiteralSeparator
DecimalDigit
DecimalDigit ::
one of 0 1 2
3 4 5 6 7
8 9
NonZeroDigit ::
one of 1 2 3
4 5 6 7 8
9
ExponentPart [Sep]
::
ExponentIndicator
SignedInteger [?Sep]
ExponentIndicator
:: one of e
E
SignedInteger [Sep]
::
DecimalDigits [?Sep]
+
DecimalDigits [?Sep]
-
DecimalDigits [?Sep]
BinaryIntegerLiteral [Sep]
::
0b
BinaryDigits [?Sep]
0B
BinaryDigits [?Sep]
BinaryDigits [Sep]
::
BinaryDigit
BinaryDigits [?Sep]
BinaryDigit
[+Sep]
BinaryDigits [+Sep]
NumericLiteralSeparator
BinaryDigit
BinaryDigit ::
one of 0 1
OctalIntegerLiteral [Sep]
::
0o
OctalDigits [?Sep]
0O
OctalDigits [?Sep]
OctalDigits [Sep]
::
OctalDigit
OctalDigits [?Sep]
OctalDigit
[+Sep]
OctalDigits [+Sep]
NumericLiteralSeparator
OctalDigit
LegacyOctalIntegerLiteral
::
0
OctalDigit
LegacyOctalIntegerLiteral
OctalDigit
NonOctalDecimalIntegerLiteral
::
0
NonOctalDigit
LegacyOctalLikeDecimalIntegerLiteral
NonOctalDigit
NonOctalDecimalIntegerLiteral
DecimalDigit
LegacyOctalLikeDecimalIntegerLiteral
::
0
OctalDigit
LegacyOctalLikeDecimalIntegerLiteral
OctalDigit
OctalDigit ::
one of 0 1 2
3 4 5 6
7
NonOctalDigit ::
one of 8 9
HexIntegerLiteral [Sep]
::
0x
HexDigits [?Sep]
0X
HexDigits [?Sep]
HexDigits [Sep]
::
HexDigit
HexDigits [?Sep]
HexDigit
[+Sep]
HexDigits [+Sep]
NumericLiteralSeparator
HexDigit
HexDigit :: one
of 0 1 2
3 4 5 6 7
8 9 a b c
d e f A B
C D E F
SourceCharacter 가 NumericLiteral 바로 뒤에 오면 안 되며,
IdentifierStart 또는 DecimalDigit 이면 안 된다.
참고
예를 들어: 3in은 오류이며, 3과 in 두 입력 요소가 아니다.
12.9.3.1 정적 의미: 초기 에러
NumericLiteral ::
LegacyOctalIntegerLiteral
DecimalIntegerLiteral
:: NonOctalDecimalIntegerLiteral
참고
12.9.3.2 정적 의미: MV
숫자 리터럴은 Number 타입 또는
BigInt 타입 의 값을 나타낸다.
12.9.3.3 정적 의미론: NumericValue
구문 지향 연산
NumericValue는 인자를 받지 않으며, Number 또는 BigInt를 반환한다. 다음의 각 생성 규칙에 대해 개별적으로 정의된다:
NumericLiteral ::
DecimalLiteral
DecimalLiteral 의
MV에 RoundMVResult 를 적용한 값을 반환한다.
NumericLiteral ::
NonDecimalIntegerLiteral
NonDecimalIntegerLiteral 의
MV에 𝔽 를 적용한 값을 반환한다.
NumericLiteral ::
LegacyOctalIntegerLiteral
LegacyOctalIntegerLiteral 의
MV에 𝔽 를 적용한 값을 반환한다.
NumericLiteral ::
NonDecimalIntegerLiteral
BigIntLiteralSuffix
NonDecimalIntegerLiteral 의
MV에 대해 BigInt value for 를 반환한다.
DecimalBigIntegerLiteral
::
0
BigIntLiteralSuffix
0 ℤ 을 반환한다.
DecimalBigIntegerLiteral
::
NonZeroDigit
BigIntLiteralSuffix
NonZeroDigit 의 MV에
대해 BigInt value for 를 반환한다.
DecimalBigIntegerLiteral
::
NonZeroDigit
DecimalDigits
BigIntLiteralSuffix
NonZeroDigit
NumericLiteralSeparator
DecimalDigits
BigIntLiteralSuffix
n 을 DecimalDigits 내에서 NumericLiteralSeparator 를
제외한 코드 포인트 개수로 한다.
mv 를 (NonZeroDigit 의 MV ×
10n ) + DecimalDigits 의 MV로 한다.
ℤ (mv )를
반환한다.
12.9.4 문자열 리터럴
참고 1
문자열 리터럴은 작은따옴표 또는 큰따옴표로 감싸진 0개 이상의 유니코드 코드 포인트로 구성된다.
유니코드 코드 포인트는 이스케이프 시퀀스로도 표현될 수 있다. 모든 코드 포인트는 문자열 리터럴에 문자 그대로 나타날 수 있지만, 닫는 따옴표 코드 포인트,
U+005C (역슬래시), U+000D (캐리지 리턴), U+000A (줄 바꿈)는 제외된다. 어떤 코드 포인트든 이스케이프 시퀀스 형태로 나타날 수 있다.
문자열 리터럴은 ECMAScript 문자열 값으로 평가된다. 이러한 문자열 값을 생성할 때 유니코드 코드 포인트는 11.1.1 에서 정의된 대로 UTF-16으로 인코딩된다.
Basic Multilingual Plane에 속한 코드 포인트는 문자열의 단일 코드 유닛 요소로 인코딩된다.
그 외의 모든 코드 포인트는 문자열의 두 코드 유닛 요소로 인코딩된다.
구문
StringLiteral ::
"
DoubleStringCharacters opt
"
'
SingleStringCharacters opt
'
DoubleStringCharacters
::
DoubleStringCharacter
DoubleStringCharacters opt
SingleStringCharacters
::
SingleStringCharacter
SingleStringCharacters opt
DoubleStringCharacter
::
SourceCharacter
but not one of " or \ or LineTerminator
<LS>
<PS>
\
EscapeSequence
LineContinuation
SingleStringCharacter
::
SourceCharacter
but not one of ' or \ or LineTerminator
<LS>
<PS>
\
EscapeSequence
LineContinuation
LineContinuation ::
\
LineTerminatorSequence
EscapeSequence ::
CharacterEscapeSequence
0
[lookahead ∉ DecimalDigit ]
LegacyOctalEscapeSequence
NonOctalDecimalEscapeSequence
HexEscapeSequence
UnicodeEscapeSequence
CharacterEscapeSequence
::
SingleEscapeCharacter
NonEscapeCharacter
SingleEscapeCharacter
:: one of '
" \ b f n
r t v
NonEscapeCharacter
::
SourceCharacter
but not one of EscapeCharacter or LineTerminator
EscapeCharacter ::
SingleEscapeCharacter
DecimalDigit
x
u
LegacyOctalEscapeSequence
::
0
[lookahead ∈ { 8 , 9 }]
NonZeroOctalDigit
[lookahead ∉ OctalDigit ]
ZeroToThree
OctalDigit
[lookahead ∉ OctalDigit ]
FourToSeven
OctalDigit
ZeroToThree
OctalDigit
OctalDigit
NonZeroOctalDigit
::
OctalDigit but
not 0
ZeroToThree ::
one of 0 1 2
3
FourToSeven ::
one of 4 5 6
7
NonOctalDecimalEscapeSequence
:: one of 8
9
HexEscapeSequence
::
x
HexDigit
HexDigit
UnicodeEscapeSequence
::
u
Hex4Digits
u{
CodePoint
}
Hex4Digits ::
HexDigit
HexDigit
HexDigit
HexDigit
비단말 기호 HexDigit 의 정의는 12.9.3 에 있다. SourceCharacter 는 11.1 에 정의되어
있다.
참고 2
<LF>와 <CR>은 LineContinuation 의 일부로서 빈 코드 포인트 시퀀스를
생성하는 경우를 제외하고 문자열 리터럴에 나타날 수 없다. 문자열 리터럴의 문자열 값에 이를 포함시키는 올바른 방법은 \n 또는
\u000A와 같은 이스케이프 시퀀스를 사용하는 것이다.
12.9.4.1 정적 의미론: 초기 에러
EscapeSequence ::
LegacyOctalEscapeSequence
NonOctalDecimalEscapeSequence
참고 1
비엄격 코드 에서는 이 구문이
Legacy 이다.
참고 2
문자열 리터럴이 Use Strict 지시문 앞에 올 수 있으며, 이 경우
둘러싸는 코드가 엄격 모드 가 된다. 구현체는 이러한 리터럴에 대해 위
규칙을 적용해야 한다. 예를 들어, 다음 소스 텍스트는 구문 에러를 포함한다:
function invalid ( ) { "\7" ; "use strict" ; }
12.9.4.2 정적 의미론: SV
구문 지향 연산
SV는 인자를 받지 않으며, 문자열을 반환한다.
문자열 리터럴은 String 타입 의 값을 의미한다.
SV는 문자열 리터럴의 다양한 부분에 재귀적으로 적용되어 문자열 값을 생성한다. 이 과정의 일부로, 문자열 리터럴 내의 일부 유니코드 코드 포인트는 아래 또는
12.9.3 에서 설명한 대로 수학적
값 을 갖는 것으로 해석된다.
표 37: 문자열 단일 문자 이스케이프 시퀀스
이스케이프 시퀀스
코드 유닛 값
유니코드 문자 이름
기호
\b
0x0008
백스페이스(BACKSPACE)
<BS>
\t
0x0009
문자 탭(CHARACTER TABULATION)
<HT>
\n
0x000A
줄 바꿈(LINE FEED, LF)
<LF>
\v
0x000B
수직 탭(LINE TABULATION)
<VT>
\f
0x000C
폼 피드(FORM FEED, FF)
<FF>
\r
0x000D
캐리지 리턴(CARRIAGE RETURN, CR)
<CR>
\"
0x0022
큰따옴표(QUOTATION MARK)
"
\'
0x0027
작은따옴표(APOSTROPHE)
'
\\
0x005C
역슬래시(REVERSE SOLIDUS)
\
12.9.4.3 정적 의미론: MV
12.9.5 정규 표현식 리터럴
노트 1
정규 표현식 리터럴은 평가될 때마다 RegExp 객체로 변환되는 입력 요소입니다
(22.2 참조). 프로그램 내의 두
정규 표현식 리터럴은,
두 리터럴의 내용이 동일하더라도 서로 ===로 비교될 때 같지 않은 정규 표현식 객체로 평가됩니다. RegExp 객체는
new RegExp 또는 RegExp 생성자 를 함수로 호출하여 런타임에 생성할 수도 있습니다
(22.2.4 참조).
아래의 생성 규칙은 정규 표현식 리터럴의 구문을 설명하며, 입력 요소 스캐너가 정규 표현식 리터럴의 끝을 찾을 때 사용됩니다.
RegularExpressionBody 와 RegularExpressionFlags 를
구성하는 소스 텍스트는
이후 더 엄격한 ECMAScript 정규 표현식 문법을 사용하여 다시 파싱됩니다
(22.2.1 ).
구현체는 22.2.1 에
정의된 ECMAScript 정규 표현식 문법을 확장할 수 있지만,
아래에 정의된 RegularExpressionBody 및 RegularExpressionFlags
생성 규칙
또는 이 생성 규칙들이 사용하는 생성 규칙은 확장할 수 없습니다.
구문
RegularExpressionLiteral
::
/
RegularExpressionBody
/
RegularExpressionFlags
RegularExpressionBody
::
RegularExpressionFirstChar
RegularExpressionChars
RegularExpressionChars
::
[empty]
RegularExpressionChars
RegularExpressionChar
RegularExpressionFirstChar
::
RegularExpressionNonTerminator
단, * 또는 \ 또는 / 또는
[ 중 하나가 아니어야 함
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionChar
::
RegularExpressionNonTerminator
단, \ 또는 / 또는
[ 중 하나가 아니어야 함
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionBackslashSequence
::
\
RegularExpressionNonTerminator
RegularExpressionNonTerminator
::
SourceCharacter
LineTerminator 가 아니어야 함
RegularExpressionClass
::
[
RegularExpressionClassChars
]
RegularExpressionClassChars
::
[empty]
RegularExpressionClassChars
RegularExpressionClassChar
RegularExpressionClassChar
::
RegularExpressionNonTerminator
단, ] 또는 \ 중 하나가 아니어야 함
RegularExpressionBackslashSequence
RegularExpressionFlags
::
[empty]
RegularExpressionFlags
IdentifierPartChar
노트 2
정규 표현식 리터럴은 비어 있을 수 없습니다; 빈 정규 표현식 리터럴을 나타내는 대신, 코드 유닛 시퀀스 //는 단일 행 주석을
시작합니다.
빈 정규 표현식을 지정하려면 /(?:)/을 사용하세요.
12.9.5.1 정적 의미론: BodyText
구문 지시 연산
BodyText는 인수를 받지 않으며 소스 텍스트를 반환합니다.
다음 생성 규칙에 대해 개별적으로 정의됩니다:
RegularExpressionLiteral
::
/
RegularExpressionBody
/
RegularExpressionFlags
RegularExpressionBody 로 인식된
소스 텍스트를 반환한다.
12.9.5.2 정적 의미론: FlagText
구문 지시 연산
FlagText는 인수를 받지 않으며 소스 텍스트를 반환합니다.
다음 생성 규칙에 대해 개별적으로 정의됩니다:
RegularExpressionLiteral
::
/
RegularExpressionBody
/
RegularExpressionFlags
RegularExpressionFlags 로 인식된
소스 텍스트를 반환한다.
12.9.6 템플릿 리터럴 렉시컬 구성 요소
구문
Template ::
NoSubstitutionTemplate
TemplateHead
NoSubstitutionTemplate
::
`
TemplateCharacters opt
`
TemplateHead ::
`
TemplateCharacters opt
${
TemplateSubstitutionTail
::
TemplateMiddle
TemplateTail
TemplateMiddle ::
}
TemplateCharacters opt
${
TemplateTail ::
}
TemplateCharacters opt
`
TemplateCharacters
::
TemplateCharacter
TemplateCharacters opt
TemplateCharacter
::
$
[lookahead ≠ { ]
\
TemplateEscapeSequence
\
NotEscapeSequence
LineContinuation
LineTerminatorSequence
SourceCharacter
단, ` 또는 \ 또는 $ 또는
LineTerminator 중
하나가 아니어야 함
TemplateEscapeSequence
::
CharacterEscapeSequence
0
[lookahead ∉ DecimalDigit ]
HexEscapeSequence
UnicodeEscapeSequence
NotEscapeSequence
::
0
DecimalDigit
DecimalDigit
단, 0 이 아니어야 함
x
[lookahead ∉ HexDigit ]
x
HexDigit
[lookahead ∉ HexDigit ]
u
[lookahead ∉ HexDigit ]
[lookahead ≠ { ]
u
HexDigit
[lookahead ∉ HexDigit ]
u
HexDigit
HexDigit
[lookahead ∉ HexDigit ]
u
HexDigit
HexDigit
HexDigit
[lookahead ∉ HexDigit ]
u
{
[lookahead ∉ HexDigit ]
u
{
NotCodePoint
[lookahead ∉ HexDigit ]
u
{
CodePoint
[lookahead ∉ HexDigit ]
[lookahead ≠ } ]
NotCodePoint ::
HexDigits [~Sep]
단, HexDigits 의
MV가 0x10FFFF보다 커야 함
CodePoint ::
HexDigits [~Sep]
단, HexDigits 의
MV가 0x10FFFF 이하여야 함
노트
12.9.6.1 정적 의미론: TV
구문 지시 연산
TV는 인수를 받지 않으며 String 또는
undefined 를 반환합니다. 템플릿 리터럴 구성 요소는 TV에 의해
String 타입 값으로
해석됩니다. TV는
템플릿 객체의 인덱스드 구성 요소(일상적으로 템플릿 값)를 구성하는 데 사용됩니다. TV에서 이스케이프 시퀀스는 해당 이스케이프 시퀀스가 나타내는 유니코드 코드
포인트의 UTF-16 코드 유닛(들)로 대체됩니다.
12.9.6.2 정적 의미론: TRV
구문 지시 연산
TRV는 인수를 받지 않으며 String을 반환합니다. 템플릿 리터럴 구성 요소는 TRV에 의해
String 타입 값으로
해석됩니다. TRV는
템플릿 객체의 원시(raw) 구성 요소(일상적으로 템플릿 원시 값)를 구성하는 데 사용됩니다. TRV는 TV 와 유사하지만,
TRV에서는 이스케이프 시퀀스가 리터럴에 나타난 그대로 해석된다는 점이 다릅니다.
NoSubstitutionTemplate
::
`
`
의 TRV는 빈 문자열입니다.
TemplateHead
::
`
${
의 TRV는 빈 문자열입니다.
TemplateMiddle
::
}
${
의 TRV는 빈 문자열입니다.
TemplateTail
::
}
`
의 TRV는 빈 문자열입니다.
TemplateCharacters
::
TemplateCharacter
TemplateCharacters
의 TRV는 TemplateCharacter 의 TRV와
TemplateCharacters 의 TRV를
문자열 연결 한 값입니다.
TemplateCharacter
:: SourceCharacter
단, ` 또는 \ 또는
$ 또는 LineTerminator 중 하나가
아니어야 함
의 TRV는 SourceCharacter 로 매칭된 코드 포인트에
UTF16EncodeCodePoint 를 수행한 결과입니다.
TemplateCharacter
:: $
의 TRV는 코드 유닛 0x0024(DOLLAR SIGN)로 구성된 문자열 값입니다.
TemplateCharacter
::
\
TemplateEscapeSequence
의 TRV는 코드 유닛 0x005C(REVERSE SOLIDUS)와 TemplateEscapeSequence 의 TRV를
문자열 연결 한 값입니다.
TemplateCharacter
::
\
NotEscapeSequence
의 TRV는 코드 유닛 0x005C(REVERSE SOLIDUS)와 NotEscapeSequence 의 TRV를
문자열 연결 한 값입니다.
TemplateEscapeSequence
:: 0
의 TRV는 코드 유닛 0x0030(DIGIT ZERO)로 구성된 문자열 값입니다.
NotEscapeSequence
::
0
DecimalDigit
의 TRV는 코드 유닛 0x0030(DIGIT ZERO)와 DecimalDigit 의 TRV를
문자열 연결 한 값입니다.
NotEscapeSequence
::
x
[lookahead ∉ HexDigit ]
의 TRV는 코드 유닛 0x0078(LATIN SMALL LETTER X)로 구성된 문자열 값입니다.
NotEscapeSequence
::
x
HexDigit
[lookahead ∉ HexDigit ]
의 TRV는 코드 유닛 0x0078(LATIN SMALL LETTER X)와 HexDigit 의 TRV를
문자열 연결 한 값입니다.
NotEscapeSequence
::
u
[lookahead ∉ HexDigit ]
[lookahead ≠ { ]
의 TRV는 코드 유닛 0x0075(LATIN SMALL LETTER U)로 구성된 문자열 값입니다.
NotEscapeSequence
::
u
HexDigit
[lookahead ∉ HexDigit ]
의 TRV는 코드 유닛 0x0075(LATIN SMALL LETTER U)와 HexDigit 의 TRV를
문자열 연결 한 값입니다.
NotEscapeSequence
::
u
HexDigit
HexDigit
[lookahead ∉ HexDigit ]
의 TRV는 코드 유닛 0x0075(LATIN SMALL LETTER U), 첫 번째 HexDigit 의 TRV, 두 번째 HexDigit 의 TRV를
문자열 연결 한 값입니다.
NotEscapeSequence
::
u
HexDigit
HexDigit
HexDigit
[lookahead ∉ HexDigit ]
의 TRV는 코드 유닛 0x0075(LATIN SMALL LETTER U), 첫 번째 HexDigit 의 TRV, 두 번째 HexDigit 의 TRV, 세 번째 HexDigit 의 TRV를
문자열 연결 한 값입니다.
NotEscapeSequence
::
u
{
[lookahead ∉ HexDigit ]
의 TRV는 코드 유닛 0x0075(LATIN SMALL LETTER U)와 코드 유닛 0x007B(LEFT CURLY
BRACKET)을
문자열 연결 한 값입니다.
NotEscapeSequence
::
u
{
NotCodePoint
[lookahead ∉ HexDigit ]
의 TRV는 코드 유닛 0x0075(LATIN SMALL LETTER U), 코드 유닛 0x007B(LEFT CURLY
BRACKET),
NotCodePoint 의 TRV를
문자열 연결 한 값입니다.
NotEscapeSequence
::
u
{
CodePoint
[lookahead ∉ HexDigit ]
[lookahead ≠ } ]
의 TRV는 코드 유닛 0x0075(LATIN SMALL LETTER U), 코드 유닛 0x007B(LEFT CURLY
BRACKET),
CodePoint 의 TRV를
문자열 연결 한 값입니다.
DecimalDigit
:: one of 0
1 2 3 4
5 6 7 8
9
의 TRV는 이 생성 규칙에 의해 매칭된 단일 코드 포인트에
UTF16EncodeCodePoint 를 수행한 결과입니다.
CharacterEscapeSequence
:: NonEscapeCharacter
의 TRV는 NonEscapeCharacter 의
SV
값입니다.
SingleEscapeCharacter
:: one of '
" \ b f
n r t
v
의 TRV는 이 생성 규칙에 의해 매칭된 단일 코드 포인트에
UTF16EncodeCodePoint 를 수행한 결과입니다.
HexEscapeSequence
::
x
HexDigit
HexDigit
의 TRV는 코드 유닛 0x0078(LATIN SMALL LETTER X), 첫 번째 HexDigit 의 TRV, 두 번째 HexDigit 의 TRV를 문자열
연결 한 값이다.
UnicodeEscapeSequence
::
u
Hex4Digits
의 TRV는 코드 유닛 0x0075(LATIN SMALL LETTER U)와 Hex4Digits 의 TRV를 문자열
연결 한 값이다.
UnicodeEscapeSequence
::
u{
CodePoint
}
의 TRV는 코드 유닛 0x0075(LATIN SMALL LETTER U), 코드 유닛 0x007B(LEFT CURLY
BRACKET), CodePoint 의 TRV,
코드 유닛 0x007D(RIGHT CURLY BRACKET)을 문자열 연결 한 값이다.
Hex4Digits ::
HexDigit
HexDigit
HexDigit
HexDigit
의 TRV는 첫 번째 HexDigit 의 TRV, 두 번째 HexDigit 의 TRV, 세 번째 HexDigit 의 TRV, 네 번째 HexDigit 의 TRV를 문자열
연결 한 값이다.
HexDigits ::
HexDigits
HexDigit
의 TRV는 HexDigits 의 TRV와 HexDigit 의 TRV를 문자열
연결 한 값이다.
HexDigit ::
one of 0 1
2 3 4 5
6 7 8 9
a b c d
e f A B
C D E
F
의 TRV는 이 생성 규칙에 의해 매칭된 단일 코드 포인트에 UTF16EncodeCodePoint 를 수행한 결과이다.
LineContinuation
::
\
LineTerminatorSequence
의 TRV는 코드 유닛 0x005C(REVERSE SOLIDUS)와 LineTerminatorSequence 의 TRV를
문자열 연결 한 값이다.
LineTerminatorSequence
:: <LF>
의 TRV는 코드 유닛 0x000A(LINE FEED)로 이루어진 문자열 값이다.
LineTerminatorSequence
:: <CR>
의 TRV는 코드 유닛 0x000A(LINE FEED)로 이루어진 문자열 값이다.
LineTerminatorSequence
:: <LS>
의 TRV는 코드 유닛 0x2028(LINE SEPARATOR)로 이루어진 문자열 값이다.
LineTerminatorSequence
:: <PS>
의 TRV는 코드 유닛 0x2029(PARAGRAPH SEPARATOR)로 이루어진 문자열 값이다.
LineTerminatorSequence
::
<CR>
<LF>
의 TRV는 코드 유닛 0x000A(LINE FEED)로 이루어진 문자열 값이다.
노트
TV 는
LineContinuation 의 코드 유닛을 제외하지만,
TRV는 이를 포함합니다. <CR><LF>와 <CR> LineTerminatorSequence 는
TV 와 TRV 모두에서 <LF>로
정규화됩니다.
<CR> 또는 <CR><LF> 시퀀스를 포함하려면
TemplateEscapeSequence 를
명시적으로 사용해야 합니다.
12.10 자동 세미콜론 삽입
대부분의 ECMAScript 문장과 선언은 세미콜론으로 끝나야 합니다. 이러한 세미콜론은 소스 텍스트에 항상 명시적으로 나타낼 수 있습니다. 하지만 편의를 위해, 특정 상황에서는
이러한 세미콜론을 소스 텍스트에서 생략할 수 있습니다. 이러한 상황에서는 세미콜론이 자동으로 소스 코드 토큰 스트림에 삽입된다고 설명합니다.
12.10.1 자동 세미콜론 삽입 규칙
다음 규칙에서 “토큰(token)”은 목표 심볼 로 현재 렉시컬 분석에서 인식된 실제 렉시컬 토큰을 의미하며,
이는 12 절에 설명되어 있습니다.
세미콜론 삽입의 기본 규칙은 세 가지가 있습니다:
소스 텍스트를 왼쪽에서 오른쪽으로 파싱할 때, 어떤 생산 규칙에도 허용되지 않는 토큰(offending token 이라 함)을 만나면,
다음 조건 중 하나라도 참이면 그 토큰 앞에 세미콜론이 자동으로 삽입됩니다:
offending token이 이전 토큰과 하나 이상의 LineTerminator 로 구분되어 있는 경우.
offending token이 }인 경우.
이전 토큰이 )이고, 삽입된 세미콜론이 do-while 문(14.7.2 )의 종료 세미콜론으로 파싱되는 경우.
소스 텍스트를 왼쪽에서 오른쪽으로 파싱할 때, 토큰 입력 스트림의 끝에 도달하고 파서가 입력 토큰 스트림을 목표 비단말의 단일 인스턴스로 파싱할 수 없는 경우, 입력
스트림의 끝에 세미콜론이 자동으로 삽입됩니다.
소스 텍스트를 왼쪽에서 오른쪽으로 파싱할 때, 어떤 토큰이 문법의 어떤 생산 규칙에 의해 허용되지만, 그 생산 규칙이 제한된 생산(restricted
production) 이고 그 토큰이 “[no LineTerminator here]” 주석 바로 다음에 오는 터미널 또는
비단말의 첫 번째 토큰(따라서 restricted token이라 함)이며, 그 restricted token이 이전 토큰과 하나 이상의 LineTerminator 로 구분되어 있다면, 해당
restricted token 앞에 세미콜론이 자동으로 삽입됩니다.
하지만, 앞선 규칙들에 대한 추가적인 우선 조건이 있습니다: 세미콜론이 자동으로 삽입되어 빈 문장(empty statement)이 되거나, for문
헤더의 두 세미콜론 중 하나가 되면, 세미콜론은 절대 자동 삽입되지 않습니다(14.7.4 참조).
노트
다음은 문법에서 유일하게 제한된 생산(restricted production)입니다:
UpdateExpression [Yield,
Await] :
LeftHandSideExpression [?Yield,
?Await]
[no LineTerminator
here]
++
LeftHandSideExpression [?Yield,
?Await]
[no LineTerminator
here]
--
ContinueStatement [Yield,
Await] :
continue
;
continue
[no LineTerminator
here]
LabelIdentifier [?Yield,
?Await]
;
BreakStatement [Yield,
Await] :
break
;
break
[no LineTerminator
here]
LabelIdentifier [?Yield,
?Await]
;
ReturnStatement [Yield,
Await] :
return
;
return
[no LineTerminator
here]
Expression [+In,
?Yield, ?Await]
;
ThrowStatement [Yield,
Await] :
throw
[no LineTerminator
here]
Expression [+In,
?Yield, ?Await]
;
YieldExpression [In,
Await] :
yield
yield
[no LineTerminator
here]
AssignmentExpression [?In,
+Yield, ?Await]
yield
[no LineTerminator
here]
*
AssignmentExpression [?In,
+Yield, ?Await]
ArrowFunction [In,
Yield, Await] :
ArrowParameters [?Yield,
?Await]
[no LineTerminator
here]
=>
ConciseBody [?In]
AsyncFunctionDeclaration [Yield,
Await, Default] :
async
[no LineTerminator
here]
function
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
[+Default]
async
[no LineTerminator
here]
function
(
FormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
AsyncFunctionExpression
:
async
[no LineTerminator
here]
function
BindingIdentifier [~Yield,
+Await] opt
(
FormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
AsyncMethod [Yield,
Await] :
async
[no LineTerminator
here]
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
AsyncGeneratorDeclaration [Yield,
Await, Default] :
async
[no LineTerminator
here]
function
*
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
[+Default]
async
[no LineTerminator
here]
function
*
(
FormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression
:
async
[no LineTerminator
here]
function
*
BindingIdentifier [+Yield,
+Await] opt
(
FormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorMethod [Yield,
Await] :
async
[no LineTerminator
here]
*
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
AsyncArrowFunction [In,
Yield, Await] :
async
[no LineTerminator
here]
AsyncArrowBindingIdentifier [?Yield]
[no LineTerminator
here]
=>
AsyncConciseBody [?In]
CoverCallExpressionAndAsyncArrowHead [?Yield,
?Await]
[no LineTerminator
here]
=>
AsyncConciseBody [?In]
AsyncArrowHead
:
async
[no LineTerminator
here]
ArrowFormalParameters [~Yield,
+Await]
이러한 제한된 생산의 실질적 효과는 다음과 같습니다:
++ 또는 -- 토큰이 후위 연산자로 처리되는 위치에서, 그 앞에 하나 이상의 LineTerminator 가 있으면,
++ 또는 -- 앞에 세미콜론이 자동 삽입됩니다.
continue, break, return,
throw, yield 토큰이 등장하고, 그 다음 토큰 앞에 LineTerminator 가 있으면,
해당 토큰 뒤에 세미콜론이 자동 삽입됩니다.
화살표 함수(arrow function) 파라미터 뒤에 LineTerminator 가 오고, 그 뒤에
=> 토큰이 오면, 세미콜론이 자동 삽입되고 해당 구두점은 구문 오류를 발생시킵니다.
async 토큰 뒤에 LineTerminator 가 오고, 그 다음에
function 또는 IdentifierName 또는 (
토큰이 오면, 세미콜론이 자동 삽입되고 async는 다음 토큰들과 같은 식이나 클래스 요소의 일부로 처리되지 않습니다.
async 토큰 뒤에 LineTerminator 가 오고, 그 다음에
* 토큰이 오면, 세미콜론이 자동 삽입되고 해당 구두점은 구문 오류를 발생시킵니다.
이로 인해 ECMAScript 프로그래머에게 실질적으로 권장되는 사항은 다음과 같습니다:
후위 ++ 또는 -- 연산자는 피연산자와 같은 줄에 있어야 합니다.
Expression 이
return 또는 throw문에 있거나, AssignmentExpression 이
yield 표현식에 있을 때는, 그 시작이 return, throw,
yield 토큰과 같은 줄에 있어야 합니다.
LabelIdentifier 가
break 또는 continue 문에 있을 때는, break 또는
continue 토큰과 같은 줄에 있어야 합니다.
화살표 함수의 파라미터 끝과 =>는 같은 줄에 있어야 합니다.
비동기 함수나 메서드 앞의 async 토큰은 바로 뒤 토큰과 같은 줄에 있어야 합니다.
12.10.2 자동 세미콜론 삽입의 예시
이 절은 규범적인 내용이 아닙니다.
다음 소스는
{ 1 2 } 3
자동 세미콜론 삽입 규칙이 있더라도 ECMAScript 문법에서 유효한 문장이 아닙니다. 반면, 다음 소스
{ 1
2 } 3
도 ECMAScript 문법상 유효한 문장은 아니지만, 자동 세미콜론 삽입에 의해 다음과 같이 변환됩니다:
{ 1
;2 ;} 3 ;
이것은 유효한 ECMAScript 문장입니다.
다음 소스
for (a; b
)
는 유효한 ECMAScript 문장이 아니며, 자동 세미콜론 삽입에 의해 변경되지 않습니다. 그 이유는 for 문 헤더에 필요한 세미콜론이기
때문입니다. 자동 세미콜론 삽입은 for 문 헤더의 두 세미콜론 중 하나를 절대 삽입하지 않습니다.
다음 소스
return
a + b
는 자동 세미콜론 삽입에 의해 다음과 같이 변환됩니다:
return ;
a + b;
노트 1
a + b 식은 return 문에 의해 반환되는 값으로 처리되지 않습니다. 그 이유는 LineTerminator 가
return 토큰과 그 뒤 토큰 사이에 있기 때문입니다.
다음 소스
a = b
++c
는 자동 세미콜론 삽입에 의해 다음과 같이 변환됩니다:
a = b;
++c;
노트 2
++ 토큰은 변수 b에 적용되는 후위 연산자로 처리되지 않습니다. 그 이유는 LineTerminator 가
b와 ++ 사이에 있기 때문입니다.
다음 소스
if (a > b)
else c = d
는 유효한 ECMAScript 문장이 아니며, else 토큰 앞에 자동 세미콜론 삽입으로 변경되지 않습니다. 그 이유는 그 경우 자동 삽입된 세미콜론이
빈 문장(empty statement)이 되기 때문입니다.
다음 소스
a = b + c
(d + e).print ()
는 자동 세미콜론 삽입에 의해 변환되지 않습니다 . 그 이유는 두 번째 줄이 괄호로 시작하는 식이기 때문에, 전체가 함수 호출의 인수 목록으로 해석될 수 있기
때문입니다:
a = b + c (d + e).print ()
대입문이 왼쪽 괄호로 시작해야 하는 상황에서는, 자동 세미콜론 삽입에 의존하기보다는 명시적으로 이전 문장의 끝에 세미콜론을 추가하는 것이 좋습니다.
12.10.3 자동 세미콜론 삽입의 흥미로운 사례
이 절은 규범적인 내용이 아닙니다.
ECMAScript 프로그램은 자동 세미콜론 삽입에 의존해 아주 적은 세미콜론만으로 작성될 수도 있습니다. 위에서 설명한 대로, 세미콜론은 모든 줄 바꿈마다 삽입되지 않으며,
자동 세미콜론 삽입은 여러 토큰이 줄 바꿈을 가로지르는지에 따라 달라질 수 있습니다.
ECMAScript에 새로운 문법 기능이 추가됨에 따라, 자동 세미콜론 삽입에 의존하는 라인 앞에서 문법 생산이 달라지는 추가 문법 생산이 추가될 수 있습니다.
이 절에서는, 세미콜론이 삽입될 수도 있고 아닐 수도 있는 위치(즉, 앞선 소스 텍스트에 따라 달라지는 위치)를 자동 세미콜론 삽입의 흥미로운 사례로 간주합니다. 이 절의
나머지 부분에서는 이 버전의 ECMAScript에서 자동 세미콜론 삽입의 여러 흥미로운 사례를 설명합니다.
12.10.3.1 Statement List에서의 자동 세미콜론 삽입의 흥미로운 사례
StatementList 에서, 많은
StatementListItem 은
세미콜론으로 끝나며, 자동 세미콜론 삽입을 통해 생략할 수 있습니다. 위 규칙의 결과로, 표현식이 끝나는 줄의 끝에서 다음 줄이 아래 항목 중 하나로 시작한다면,
세미콜론이 필요합니다:
12.10.3.2 자동 세미콜론 삽입과 “[no
LineTerminator here]” 사례
이 절은 규범적인 내용이 아닙니다.
ECMAScript에는 “[no LineTerminator here]”를 포함하는 문법 생산이 있습니다.
이러한 생산은 때때로 문법에서 피연산자를 선택적으로 허용하기 위한 수단으로 쓰입니다. 이러한 위치에 LineTerminator 를 도입하면, 선택적 피연산자가 없는 문법 생산을
사용하게 되어 문법 생산이 바뀝니다.
이 절의 나머지 부분에서는 이 버전의 ECMAScript에서 “[no LineTerminator here]”를 사용하는 여러 생산을 설명합니다.
12.10.3.2.1 선택적 피연산자와 “[no LineTerminator here]”가 있는 문법 생산 목록
13 ECMAScript 언어: 표현식
13.1 식별자
구문
IdentifierReference [Yield,
Await] :
Identifier
[~Yield]
yield
[~Await]
await
BindingIdentifier [Yield,
Await] :
Identifier
yield
await
LabelIdentifier [Yield,
Await] :
Identifier
[~Yield]
yield
[~Await]
await
Identifier :
IdentifierName
but not ReservedWord
참고
yield와 await는 문법에서 BindingIdentifier 로 허용되며,
아래 정적 의미 에서 금지되어,
다음과 같은 경우 자동 세미콜론 삽입을 방지한다.
let
await 0 ;
13.1.1 정적 의미: 초기 에러
BindingIdentifier
: Identifier
IdentifierReference
: yield
BindingIdentifier
: yield
LabelIdentifier :
yield
IdentifierReference
: await
BindingIdentifier
: await
LabelIdentifier :
await
BindingIdentifier [Yield,
Await] : yield
이 생성규칙이 [Yield] 매개변수를 가지면 구문 에러이다.
BindingIdentifier [Yield,
Await] : await
이 생성규칙이 [Await] 매개변수를 가지면 구문 에러이다.
IdentifierReference [Yield,
Await] : Identifier
BindingIdentifier [Yield,
Await] : Identifier
LabelIdentifier [Yield,
Await] : Identifier
Identifier : IdentifierName but not
ReservedWord
IsStrict (이
구문)이 true 이고,
IdentifierName 의
StringValue 가
"implements" , "interface" , "let" ,
"package" , "private" , "protected" ,
"public" , "static" , 또는 "yield" 중
하나이면 구문 에러이다.
구문 문법의 목표 기호 가 Module 이고,
IdentifierName 의
StringValue 가
"await" 이면 구문 에러이다.
IdentifierName 의
StringValue 가,
yield 또는 await를 제외한 어떤 ReservedWord 의 StringValue 와
같으면 구문 에러이다.
참고
IdentifierName 의
StringValue 는
IdentifierName 의
모든 유니코드 이스케이프 시퀀스를 정규화하므로,
Identifier 와
ReservedWord 의 코드 포인트
시퀀스가 동일하도록
이스케이프를 사용할 수 없다.
13.1.2 정적 의미: StringValue
구문-지시 연산
StringValue는 인자를 받지 않으며 문자열을 반환한다. 다음 생성규칙에 대해 분할적으로 정의된다:
IdentifierName ::
IdentifierStart
IdentifierName
IdentifierPart
idTextUnescaped 를 IdentifierName 의 IdentifierCodePoints 로 한다.
CodePointsToString (idTextUnescaped )를
반환한다.
IdentifierReference
: yield
BindingIdentifier
: yield
LabelIdentifier :
yield
"yield" 를 반환한다.
IdentifierReference
: await
BindingIdentifier
: await
LabelIdentifier :
await
"await" 를 반환한다.
Identifier : IdentifierName but not
ReservedWord
IdentifierName 의
StringValue 를 반환한다.
PrivateIdentifier
::
#
IdentifierName
0x0023(샾, #)과 IdentifierName 의 StringValue 를 문자열
결합 하여 반환한다.
ModuleExportName :
StringLiteral
StringLiteral 의
SV 를
반환한다.
13.1.3 런타임 의미: 평가
IdentifierReference
: Identifier
Identifier 의 StringValue 로 ResolveBinding 을(를) 호출한 결과를 반환한다.
IdentifierReference
: yield
ResolveBinding ("yield" )의
결과를 반환한다.
IdentifierReference
: await
ResolveBinding ("await" )의
결과를 반환한다.
참고 1
IdentifierReference 의 평가 결과는 항상
Reference 타입의 값이다.
참고 2
비엄격
코드 에서는, 키워드
yield를 식별자로 사용할 수 있다. IdentifierReference 의 평가 결과는
yield의 바인딩을 Identifier 로서 해석한 것과 같이 된다. 초기 에러 제한은 이러한
평가가 비엄격
코드 에서만 발생할 수 있도록 보장한다.
13.2 기본 표현식
구문
PrimaryExpression [Yield,
Await] :
this
IdentifierReference [?Yield,
?Await]
Literal
ArrayLiteral [?Yield,
?Await]
ObjectLiteral [?Yield,
?Await]
FunctionExpression
ClassExpression [?Yield,
?Await]
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral [?Yield,
?Await, ~Tagged]
CoverParenthesizedExpressionAndArrowParameterList [?Yield,
?Await]
CoverParenthesizedExpressionAndArrowParameterList [Yield,
Await] :
(
Expression [+In, ?Yield,
?Await]
)
(
Expression [+In, ?Yield,
?Await]
,
)
(
)
(
...
BindingIdentifier [?Yield,
?Await]
)
(
...
BindingPattern [?Yield,
?Await]
)
(
Expression [+In, ?Yield,
?Await]
,
...
BindingIdentifier [?Yield,
?Await]
)
(
Expression [+In, ?Yield,
?Await]
,
...
BindingPattern [?Yield,
?Await]
)
보조 구문
다음 생성규칙의 인스턴스를 처리할 때
PrimaryExpression [Yield,
Await] : CoverParenthesizedExpressionAndArrowParameterList [?Yield,
?Await]
CoverParenthesizedExpressionAndArrowParameterList 의
해석은 다음 문법을 사용하여 보정된다:
ParenthesizedExpression [Yield,
Await] :
(
Expression [+In, ?Yield,
?Await]
)
13.2.1 this 키워드
13.2.1.1 런타임 의미: 평가
PrimaryExpression
: this
? ResolveThisBinding ()를 반환한다.
13.2.2 식별자 참조
IdentifierReference 에
대해서는 13.1 를 참조하라.
13.2.3 리터럴
구문
Literal :
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
13.2.3.1 런타임 의미: 평가
Literal : NullLiteral
null 을 반환한다.
Literal : BooleanLiteral
BooleanLiteral 이
토큰 false이면 false 를 반환한다.
BooleanLiteral 이
토큰 true이면 true 를 반환한다.
Literal : NumericLiteral
NumericLiteral 의
NumericValue 를 12.9.3 에 정의된 대로 반환한다.
Literal : StringLiteral
StringLiteral 의
SV 를 12.9.4.2 에 정의된 대로 반환한다.
13.2.4 배열 이니셜라이저
참고
ArrayLiteral 은
대괄호로 둘러싸인, 0개 이상의 각 요소가 배열의 원소를 나타내는 표현식으로 이루어진 리스트를 사용하여 배열(Array)의 초기화를 기술하는 표현식이다.
요소들은 반드시 리터럴일 필요는 없으며, 배열 이니셜라이저가 평가될 때마다 각각 평가된다.
배열 요소는 요소 리스트의 시작, 중간, 끝 모두에서 생략될 수 있다. 요소 리스트에서 콤마가 AssignmentExpression 앞에 오지 않는 경우(즉, 시작이거나
또 다른 콤마 뒤), 해당 빠진 배열 요소는 배열의 길이에 기여하며 이후 요소의 인덱스를 증가시킨다. 생략된 배열 요소는 정의되지 않는다. 배열의 끝에 요소가 생략된 경우,
해당 요소는 배열의 길이에 기여하지 않는다.
구문
ArrayLiteral [Yield,
Await] :
[
Elision opt
]
[
ElementList [?Yield,
?Await]
]
[
ElementList [?Yield,
?Await]
,
Elision opt
]
ElementList [Yield,
Await] :
Elision opt
AssignmentExpression [+In,
?Yield, ?Await]
Elision opt
SpreadElement [?Yield,
?Await]
ElementList [?Yield,
?Await]
,
Elision opt
AssignmentExpression [+In,
?Yield, ?Await]
ElementList [?Yield,
?Await]
,
Elision opt
SpreadElement [?Yield,
?Await]
Elision :
,
Elision
,
SpreadElement [Yield,
Await] :
...
AssignmentExpression [+In,
?Yield, ?Await]
13.2.4.1 런타임 의미: ArrayAccumulation
구문-지시 연산
ArrayAccumulation은 인수 array (배열)와 nextIndex (정수 )를 받아, 정상 완료(normal
completion) 로 정수 를 반환하거나, 비정상 완료(abrupt
completion) 를 반환한다.
다음 생성규칙에 따라 구체적으로 정의된다:
Elision : ,
len 을 nextIndex + 1로 한다.
? Set (array ,
"length" , 𝔽 (len ), true )를
수행한다.
참고: 위 단계에서 len 이 232 - 1을 초과하면 예외가 발생한다.
len 을 반환한다.
Elision :
Elision
,
? ArrayAccumulation 을 Elision 에 대해
array 와 (nextIndex + 1)을 인수로 호출한 결과를 반환한다.
ElementList :
Elision opt
AssignmentExpression
Elision 이 존재하면,
nextIndex 를 ? ArrayAccumulation 을 Elision 에 대해
array 와 nextIndex 를 인수로 호출한 결과로 설정한다.
initResult 를 ? Evaluation 을
AssignmentExpression 에 대해 호출한
결과로 한다.
initValue 를 ? GetValue (initResult )로 한다.
! CreateDataPropertyOrThrow (array ,
! ToString (𝔽 (nextIndex )),
initValue )를 수행한다.
nextIndex + 1을 반환한다.
ElementList :
Elision opt
SpreadElement
Elision 이 존재하면,
nextIndex 를 ? ArrayAccumulation 을 Elision 에 대해
array 와 nextIndex 를 인수로 호출한 결과로 설정한다.
? ArrayAccumulation 을 SpreadElement 에 대해
array 와 nextIndex 를 인수로 호출한 결과를 반환한다.
ElementList :
ElementList
,
Elision opt
AssignmentExpression
nextIndex 를 ? ArrayAccumulation 을 ElementList 에 대해
array 와 nextIndex 를 인수로 호출한 결과로 설정한다.
Elision 이 존재하면,
nextIndex 를 ? ArrayAccumulation 을 Elision 에 대해
array 와 nextIndex 를 인수로 호출한 결과로 설정한다.
initResult 를 ? Evaluation 을
AssignmentExpression 에 대해 호출한
결과로 한다.
initValue 를 ? GetValue (initResult )로 한다.
! CreateDataPropertyOrThrow (array ,
! ToString (𝔽 (nextIndex )),
initValue )를 수행한다.
nextIndex + 1을 반환한다.
ElementList :
ElementList
,
Elision opt
SpreadElement
nextIndex 를 ? ArrayAccumulation 을 ElementList 에 대해
array 와 nextIndex 를 인수로 호출한 결과로 설정한다.
Elision 이 존재하면,
nextIndex 를 ? ArrayAccumulation 을 Elision 에 대해
array 와 nextIndex 를 인수로 호출한 결과로 설정한다.
? ArrayAccumulation 을 SpreadElement 에 대해
array 와 nextIndex 를 인수로 호출한 결과를 반환한다.
SpreadElement :
...
AssignmentExpression
spreadRef 를 ? Evaluation 을
AssignmentExpression 에 대해 호출한
결과로 한다.
spreadObj 를 ? GetValue (spreadRef )로 한다.
iteratorRecord 를 ? GetIterator (spreadObj ,
sync )로 한다.
반복한다,
next 를 ? IteratorStepValue (iteratorRecord )로
한다.
next 가 done 이면 nextIndex 를 반환한다.
! CreateDataPropertyOrThrow (array ,
! ToString (𝔽 (nextIndex )),
next )를 수행한다.
nextIndex 를 nextIndex + 1로 설정한다.
참고
CreateDataPropertyOrThrow 는
표준 내장 Array
프로토타입 객체 가 [[Set]] 을 이용한 새로운 자체 속성 생성을
막는 방식으로 수정된 경우에도, 배열에 자체 속성이 정의되도록 보장하기 위해 사용된다.
13.2.4.2 런타임 의미: 평가
ArrayLiteral :
[
Elision opt
]
array 를 ! ArrayCreate (0)로 한다.
Elision 이 존재하면,
? ArrayAccumulation 을 Elision 에 대해
array 와 0을 인수로 호출하여 수행한다.
array 를 반환한다.
ArrayLiteral :
[
ElementList
]
array 를 ! ArrayCreate (0)로 한다.
? ArrayAccumulation 을 ElementList 에 대해
array 와 0을 인수로 호출하여 수행한다.
array 를 반환한다.
ArrayLiteral :
[
ElementList
,
Elision opt
]
array 를 ! ArrayCreate (0)로 한다.
nextIndex 를 ? ArrayAccumulation 을 ElementList 에 대해
array 와 0을 인수로 호출한 결과로 한다.
Elision 이 존재하면,
? ArrayAccumulation 을 Elision 에 대해
array 와 nextIndex 를 인수로 호출하여 수행한다.
array 를 반환한다.
13.2.5 객체 이니셜라이저
참고 1
객체 이니셜라이저는 객체(Object)의 초기화를 기술하는 표현식으로, 리터럴과 유사한 형태로 작성된다. 중괄호로 감싸진 0개 이상의 프로퍼티 키 와
해당 값의 쌍의 리스트이다. 값은 반드시 리터럴일 필요는 없으며, 객체 이니셜라이저가 평가될 때마다 각각 평가된다.
구문
ObjectLiteral [Yield,
Await] :
{
}
{
PropertyDefinitionList [?Yield,
?Await]
}
{
PropertyDefinitionList [?Yield,
?Await]
,
}
PropertyDefinitionList [Yield,
Await] :
PropertyDefinition [?Yield,
?Await]
PropertyDefinitionList [?Yield,
?Await]
,
PropertyDefinition [?Yield,
?Await]
PropertyDefinition [Yield,
Await] :
IdentifierReference [?Yield,
?Await]
CoverInitializedName [?Yield,
?Await]
PropertyName [?Yield,
?Await]
:
AssignmentExpression [+In,
?Yield, ?Await]
MethodDefinition [?Yield,
?Await]
...
AssignmentExpression [+In,
?Yield, ?Await]
PropertyName [Yield,
Await] :
LiteralPropertyName
ComputedPropertyName [?Yield,
?Await]
LiteralPropertyName
:
IdentifierName
StringLiteral
NumericLiteral
ComputedPropertyName [Yield,
Await] :
[
AssignmentExpression [+In,
?Yield, ?Await]
]
CoverInitializedName [Yield,
Await] :
IdentifierReference [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await]
Initializer [In, Yield,
Await] :
=
AssignmentExpression [?In,
?Yield, ?Await]
참고 2
참고 3
특정 맥락에서는 ObjectLiteral 이 더 제한적인 2차 문법을 감싸는 커버 문법으로
사용된다. CoverInitializedName 생성규칙은 이러한 2차
문법을 완전히 커버하기 위해 필요하다. 그러나 이 생성규칙을 사용하는 경우, 실제 ObjectLiteral 이 기대되는 일반적인 맥락에서는 초기 구문 에러가
발생한다.
13.2.5.1 정적 의미: 초기 에러
PropertyDefinition
: MethodDefinition
실제 객체 이니셜라이저를 설명하는 것 이외에도, ObjectLiteral 생성규칙은 ObjectAssignmentPattern 의 커버
문법(cover grammar)으로도 사용될 수 있으며, CoverParenthesizedExpressionAndArrowParameterList 의
일부로 인식될 수 있다. ObjectLiteral 이 ObjectAssignmentPattern 이 요구되는 문맥에
나타나는 경우, 아래 초기 에러 규칙들은 적용되지 않는다 . 또한, CoverParenthesizedExpressionAndArrowParameterList
또는 CoverCallExpressionAndAsyncArrowHead 을
처음 파싱할 때도 적용되지 않는다.
PropertyDefinition
: CoverInitializedName
이 생성규칙에 소스 텍스트가 일치하면 구문 에러이다.
참고 1
이 생성규칙은 ObjectLiteral 이 ObjectAssignmentPattern 의
커버 문법으로 사용될 수 있도록 존재한다. 실제 객체 이니셜라이저에는 등장할 수 없다.
ObjectLiteral :
{
PropertyDefinitionList
}
{
PropertyDefinitionList
,
}
참고 2
13.2.5.2 정적 의미: IsComputedPropertyKey
구문-지시 연산
IsComputedPropertyKey는 인수를 받지 않으며 불리언을 반환한다. 다음 생성규칙에 대해 분할적으로 정의된다:
PropertyName :
LiteralPropertyName
false 를 반환한다.
PropertyName :
ComputedPropertyName
true 를 반환한다.
13.2.5.3 정적 의미: PropertyNameList
구문-지시 연산
PropertyNameList는 인수를 받지 않으며 문자열의 List 를
반환한다. 다음 생성규칙에 대해 분할적으로 정의된다:
PropertyDefinitionList
: PropertyDefinition
propName 을 PropertyDefinition 의 PropName 으로 한다.
propName 이 empty 이면, 새로운 빈 List 를 반환한다.
« propName »를 반환한다.
PropertyDefinitionList
:
PropertyDefinitionList
,
PropertyDefinition
list 를 PropertyDefinitionList 의
PropertyNameList 로
한다.
propName 을 PropertyDefinition 의 PropName 로 한다.
propName 이 empty 이면, list 를 반환한다.
list 와 « propName »의 list-concatenation 을
반환한다.
13.2.5.4 런타임 의미: 평가
ObjectLiteral :
{
}
OrdinaryObjectCreate (%Object.prototype% )를
반환한다.
ObjectLiteral :
{
PropertyDefinitionList
}
{
PropertyDefinitionList
,
}
obj 를 OrdinaryObjectCreate (%Object.prototype% )로
한다.
PropertyDefinitionList 의
PropertyDefinitionEvaluation 을
obj 를 인수로 하여 호출한다.
obj 를 반환한다.
LiteralPropertyName
: IdentifierName
IdentifierName 의
StringValue 를 반환한다.
LiteralPropertyName
: StringLiteral
StringLiteral 의
SV 를 반환한다.
LiteralPropertyName
: NumericLiteral
nbr 을 NumericLiteral 의 NumericValue 로 한다.
! ToString (nbr )을 반환한다.
ComputedPropertyName
:
[
AssignmentExpression
]
exprValue 를 ? Evaluation 을
AssignmentExpression 에 대해 호출한
결과로 한다.
propName 을 ? GetValue (exprValue )로 한다.
? ToPropertyKey (propName )를 반환한다.
13.2.5.5 런타임 의미: PropertyDefinitionEvaluation
구문-지시 연산
PropertyDefinitionEvaluation은 인수 object (객체)를 받고, 정상 완료(normal
completion) unused 또는 비정상 완료(abrupt
completion) 를 반환한다. 다음 생성규칙에 대해 분할적으로 정의된다:
PropertyDefinitionList
:
PropertyDefinitionList
,
PropertyDefinition
? PropertyDefinitionEvaluation 을 PropertyDefinitionList 에 대해
object 를 인수로 호출하여 수행한다.
? PropertyDefinitionEvaluation 을 PropertyDefinition 에 대해
object 를 인수로 호출하여 수행한다.
unused 를 반환한다.
PropertyDefinition
:
...
AssignmentExpression
exprValue 를 ? Evaluation 을
AssignmentExpression 에 대해 호출한
결과로 한다.
fromValue 를 ? GetValue (exprValue )로 한다.
excludedNames 를 새로운 빈 List 로 한다.
? CopyDataProperties (object ,
fromValue , excludedNames )를 수행한다.
unused 를 반환한다.
PropertyDefinition
: IdentifierReference
propName 을 IdentifierReference 의 StringValue 로 한다.
exprValue 를 ? Evaluation 을
IdentifierReference 에 대해 호출한
결과로 한다.
propValue 를 ? GetValue (exprValue )로 한다.
Assert :
object 는 일반적이고 확장 가능한 객체이며 비구성 가능(non-configurable) 속성이 없어야 한다.
! CreateDataPropertyOrThrow (object ,
propName , propValue )를 수행한다.
unused 를 반환한다.
PropertyDefinition
:
PropertyName
:
AssignmentExpression
propKey 를 ? Evaluation 을
PropertyName 에 대해
호출한 결과로 한다.
이 PropertyDefinition 이 ParseJSON 을 위해 평가 중인 Script 내에 포함되어 있다면,
isProtoSetter 를 false 로 한다.
그렇지 않고, propKey 가 "__proto__" 이고 PropertyName 의
IsComputedPropertyKey 가
false 라면,
isProtoSetter 를 true 로 한다.
그 외의 경우,
isProtoSetter 를 false 로 한다.
IsAnonymousFunctionDefinition (AssignmentExpression )이
true 이고, isProtoSetter 가 false 라면,
propValue 를 ? NamedEvaluation 을 AssignmentExpression
및 propKey 를 인수로 호출한 결과로 한다.
그 외의 경우,
exprValueRef 를 ? Evaluation 을 AssignmentExpression 에
대해 호출한 결과로 한다.
propValue 를 ? GetValue (exprValueRef )로
한다.
isProtoSetter 가 true 라면,
propValue 가 객체 이거나 propValue 가
null 이라면,
! object .[[SetPrototypeOf]] (propValue )를
수행한다.
unused 를 반환한다.
Assert :
object 는 일반적이고 확장 가능한 객체이며 비구성 가능(non-configurable) 속성이 없어야 한다.
! CreateDataPropertyOrThrow (object ,
propKey , propValue )를 수행한다.
unused 를 반환한다.
PropertyDefinition
: MethodDefinition
? MethodDefinitionEvaluation 을 MethodDefinition 에
대해 object 와 true 를 인수로 호출하여 수행한다.
unused 를 반환한다.
13.2.6 함수 정의 표현식
15.2 에서
PrimaryExpression
: FunctionExpression
를 참조하라.
15.5 에서
PrimaryExpression
: GeneratorExpression
를 참조하라.
15.7 에서
PrimaryExpression
: ClassExpression
를 참조하라.
15.8 에서
PrimaryExpression
: AsyncFunctionExpression
를 참조하라.
15.6 에서
PrimaryExpression
: AsyncGeneratorExpression
를 참조하라.
13.2.7 정규 표현식 리터럴
구문
12.9.5 를 참조하라.
13.2.7.1 정적 의미: 초기 에러
PrimaryExpression
: RegularExpressionLiteral
13.2.7.2 정적 의미: IsValidRegularExpressionLiteral (
literal )
추상 연산 IsValidRegularExpressionLiteral은 인수 literal (RegularExpressionLiteral
파스
노드 )를 받고 불리언을 반환한다. 이 연산은 인수가 유효한 정규 표현식 리터럴인지 판단한다. 호출 시 다음 단계를 수행한다:
flags 를 literal 의 FlagText 로 한다.
flags 에 d, g, i, m,
s, u, v, y 이외의 코드 포인트가 포함되어 있거나,
flags 에 동일한 코드 포인트가 두 번 이상 포함되어 있으면 false 를 반환한다.
flags 에 u가 포함되어 있으면 u 를 true 로,
아니면 false 로 한다.
flags 에 v가 포함되어 있으면 v 를 true 로,
아니면 false 로 한다.
patternText 를 literal 의 BodyText 로
한다.
u 가 false 이고 v 가 false 이면,
stringValue 를 CodePointsToString (patternText )로
한다.
patternText 를 stringValue 의 각 16비트 요소를 유니코드 BMP 코드 포인트로
해석하여 얻은 코드 포인트 시퀀스로 설정한다. UTF-16 디코딩은 적용하지 않는다.
parseResult 를 ParsePattern (patternText ,
u , v )로 한다.
parseResult 가 파스 노드 라면
true 를, 그렇지 않으면 false 를 반환한다.
13.2.7.3 런타임 의미: 평가
PrimaryExpression
: RegularExpressionLiteral
pattern 을 CodePointsToString (BodyText of RegularExpressionLiteral )로
한다.
flags 를 CodePointsToString (FlagText of RegularExpressionLiteral )로
한다.
! RegExpCreate (pattern ,
flags )를 반환한다.
13.2.8 템플릿 리터럴
구문
TemplateLiteral [Yield, Await,
Tagged] :
NoSubstitutionTemplate
SubstitutionTemplate [?Yield,
?Await, ?Tagged]
SubstitutionTemplate [Yield,
Await, Tagged] :
TemplateHead
Expression [+In, ?Yield,
?Await]
TemplateSpans [?Yield,
?Await, ?Tagged]
TemplateSpans [Yield, Await,
Tagged] :
TemplateTail
TemplateMiddleList [?Yield,
?Await, ?Tagged]
TemplateTail
TemplateMiddleList [Yield,
Await, Tagged] :
TemplateMiddle
Expression [+In, ?Yield,
?Await]
TemplateMiddleList [?Yield,
?Await, ?Tagged]
TemplateMiddle
Expression [+In, ?Yield,
?Await]
13.2.8.1 정적 의미론: 초기 에러
TemplateLiteral [Yield,
Await, Tagged] :
NoSubstitutionTemplate
TemplateLiteral [Yield,
Await, Tagged] :
SubstitutionTemplate [?Yield,
?Await, ?Tagged]
SubstitutionTemplate [Yield,
Await, Tagged] :
TemplateHead
Expression [+In, ?Yield,
?Await]
TemplateSpans [?Yield,
?Await, ?Tagged]
TemplateSpans [Yield, Await,
Tagged] : TemplateTail
TemplateMiddleList [Yield,
Await, Tagged] :
TemplateMiddle
Expression [+In, ?Yield,
?Await]
TemplateMiddleList [?Yield,
?Await, ?Tagged]
TemplateMiddle
Expression [+In, ?Yield,
?Await]
13.2.8.2 정적 의미론: TemplateStrings
구문 지향 연산
TemplateStrings는 raw (불리언)를 인수로 받고, 문자열 또는 undefined 의
리스트 를 반환한다. 이는 다음 생산식들에
대해 부분적으로 정의된다:
TemplateLiteral
: NoSubstitutionTemplate
« TemplateString (NoSubstitutionTemplate ,
raw ) »를 반환한다.
SubstitutionTemplate
:
TemplateHead
Expression
TemplateSpans
head 를 « TemplateString (TemplateHead ,
raw ) »로 한다.
tail 을 TemplateStrings
of TemplateSpans
with argument raw 로 한다.
head 와 tail 의 리스트 결합 을 반환한다.
TemplateSpans :
TemplateTail
« TemplateString (TemplateTail ,
raw ) »를 반환한다.
TemplateSpans :
TemplateMiddleList
TemplateTail
middle 을 TemplateStrings
of TemplateMiddleList with
argument raw 로 한다.
tail 을 « TemplateString (TemplateTail ,
raw ) »로 한다.
middle 와 tail 의 리스트 결합 을 반환한다.
TemplateMiddleList
:
TemplateMiddle
Expression
« TemplateString (TemplateMiddle ,
raw ) »를 반환한다.
TemplateMiddleList
:
TemplateMiddleList
TemplateMiddle
Expression
front 를 TemplateStrings
of TemplateMiddleList with
argument raw 로 한다.
last 를 « TemplateString (TemplateMiddle ,
raw ) »로 한다.
front 와 last 의 리스트 결합 을 반환한다.
13.2.8.3 정적 의미론: TemplateString (
templateToken , raw )
추상 연산 TemplateString은 templateToken (NoSubstitutionTemplate 파스
노드 , TemplateHead 파스
노드 , TemplateMiddle 파스
노드 , 또는 TemplateTail 파스
노드 )와 raw (불리언)를 인수로 받고, 문자열 또는
undefined 를 반환한다. 호출 시 다음 단계를 수행한다:
만약 raw 가 true 이면,
string 을 TRV of
templateToken 으로 한다.
그 외에는,
string 을 TV of
templateToken 으로 한다.
string 을 반환한다.
참고
이 연산은 raw 가 false 이고 templateToken 에 NotEscapeSequence 가 포함된 경우
undefined 를 반환한다. 그 외의 경우에는 문자열을 반환한다.
13.2.8.4 GetTemplateObject ( templateLiteral )
추상 연산 GetTemplateObject는 templateLiteral (파스 노드 )를 인수로 받고, 배열을 반환한다.
호출 시 다음 단계를 수행한다:
realm 을 현재 Realm Record 로 한다.
templateRegistry 를 realm .[[TemplateMap]] 으로 한다.
templateRegistry 의 각 요소 e 에 대해,
만약 e .[[Site]] 가 동일한 파스 노드 인
templateLiteral 과 같다면,
e .[[Array]] 를 반환한다.
rawStrings 를 TemplateStrings
of templateLiteral with argument true 로 한다.
Assert :
rawStrings 는 문자열
리스트 이다.
cookedStrings 를 TemplateStrings
of templateLiteral with argument false 로 한다.
count 를 리스트
cookedStrings 의 요소 개수로 한다.
Assert :
count ≤ 232 - 1.
template 을 ! ArrayCreate (count )로 한다.
rawObj 를 ! ArrayCreate (count )로 한다.
index 를 0으로 한다.
index < count 동안 반복,
prop 을 ! ToString (𝔽 (index ))로 한다.
cookedValue 를 cookedStrings [index ]로 한다.
! DefinePropertyOrThrow (template ,
prop , PropertyDescriptor { [[Value]] :
cookedValue , [[Writable]] :
false , [[Enumerable]] :
true , [[Configurable]] :
false })를 수행한다.
rawValue 를 rawStrings [index ]로 한다.
! DefinePropertyOrThrow (rawObj ,
prop , PropertyDescriptor { [[Value]] :
rawValue , [[Writable]] :
false , [[Enumerable]] :
true , [[Configurable]] :
false })를 수행한다.
index 를 index + 1로 한다.
! SetIntegrityLevel (rawObj ,
frozen )을 수행한다.
! DefinePropertyOrThrow (template ,
"raw" , PropertyDescriptor { [[Value]] :
rawObj , [[Writable]] : false ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
! SetIntegrityLevel (template ,
frozen )을 수행한다.
Record { [[Site]] : templateLiteral , [[Array]] : template }를
realm .[[TemplateMap]] 에 추가한다.
template 을 반환한다.
참고 1
템플릿 객체의 생성은 비정상
완료 를 일으킬 수 없다.
참고 2
realm 의 프로그램
코드에 있는 각 TemplateLiteral 는 태그드 템플릿 평가에 사용되는
고유한 템플릿 객체와 연결되어 있다 (13.2.8.6 ).
템플릿 객체는 frozen 상태이며, 특정 태그드 템플릿이 평가될 때마다 동일한 템플릿 객체가 사용된다. 템플릿 객체가 TemplateLiteral 의 첫
평가 시점에 지연 생성(lazy)되는지 혹은 사전에 미리 생성되는지는 구현 선택 사항이며, ECMAScript 코드에서는 관찰할 수 없다.
참고 3
이 명세의 미래 버전에서는 템플릿 객체의 추가적인 non-enumerable 프로퍼티가 정의될 수 있다.
13.2.8.5 런타임 의미론: SubstitutionEvaluation
구문 지향 연산
SubstitutionEvaluation은 인수를 받지 않으며, 리스트 나
비정상 완료 를 반환한다. 다음
생산식들에 대해 정의된다:
TemplateSpans :
TemplateTail
새로운 빈 리스트 를 반환한다.
TemplateSpans :
TemplateMiddleList
TemplateTail
? SubstitutionEvaluation of TemplateMiddleList 의 결과를 반환한다.
TemplateMiddleList
:
TemplateMiddle
Expression
subRef 를 ? Evaluation of
Expression 의 결과로 한다.
sub 를 ? GetValue (subRef )로 한다.
« sub »를 반환한다.
TemplateMiddleList
:
TemplateMiddleList
TemplateMiddle
Expression
preceding 을 ? SubstitutionEvaluation of TemplateMiddleList 의 결과로 한다.
nextRef 를 ? Evaluation of
Expression 의 결과로 한다.
next 를 ? GetValue (nextRef )로 한다.
preceding 과 « next »의 리스트 결합 을 반환한다.
13.2.8.6 런타임 의미론: 평가
TemplateLiteral
: NoSubstitutionTemplate
TV of NoSubstitutionTemplate 를
12.9.6 에 정의된
대로 반환한다.
SubstitutionTemplate
:
TemplateHead
Expression
TemplateSpans
head 를 TV of TemplateHead 로 하고,
12.9.6 에 정의된
대로 한다.
subRef 를 ? Evaluation of
Expression 의 결과로 한다.
sub 를 ? GetValue (subRef )로 한다.
middle 을 ? ToString (sub )로 한다.
tail 을 ? Evaluation of
TemplateSpans 의
결과로 한다.
head , middle , tail 의 문자열
결합 을 반환한다.
참고 1
Expression 값에 적용되는
문자열 변환 의미는 String.prototype.concat과 같으며 + 연산자와는 다르다.
TemplateSpans :
TemplateTail
TV of TemplateTail 를
12.9.6 에 정의된
대로 반환한다.
TemplateSpans :
TemplateMiddleList
TemplateTail
head 를 ? Evaluation of
TemplateMiddleList 의 결과로 한다.
tail 을 TV of TemplateTail 를
12.9.6 에 정의된
대로 한다.
head 와 tail 의 문자열 결합 을 반환한다.
TemplateMiddleList
:
TemplateMiddle
Expression
head 를 TV of TemplateMiddle 를
12.9.6 에 정의된
대로 한다.
subRef 를 ? Evaluation of
Expression 의 결과로 한다.
sub 를 ? GetValue (subRef )로 한다.
middle 을 ? ToString (sub )로 한다.
head 와 middle 의 문자열 결합 을 반환한다.
참고 2
Expression 값에 적용되는
문자열 변환 의미는 String.prototype.concat과 같으며 + 연산자와는 다르다.
TemplateMiddleList
:
TemplateMiddleList
TemplateMiddle
Expression
rest 를 ? Evaluation of
TemplateMiddleList 의 결과로 한다.
middle 을 TV of TemplateMiddle 를
12.9.6 에 정의된
대로 한다.
subRef 를 ? Evaluation of
Expression 의 결과로 한다.
sub 를 ? GetValue (subRef )로 한다.
last 를 ? ToString (sub )로 한다.
rest , middle , last 의 문자열
결합 을 반환한다.
참고 3
Expression 값에 적용되는
문자열 변환 의미는 String.prototype.concat과 같으며 + 연산자와는 다르다.
13.2.9 그룹화 연산자
13.2.9.1 정적 의미론: 초기 에러
PrimaryExpression
: CoverParenthesizedExpressionAndArrowParameterList
13.2.9.2 런타임 의미론: 평가
PrimaryExpression
: CoverParenthesizedExpressionAndArrowParameterList
expr 를 ParenthesizedExpression 로
한다. 이는 포함된 CoverParenthesizedExpressionAndArrowParameterList 이다.
? Evaluation of expr 를 반환한다.
ParenthesizedExpression
:
(
Expression
)
? Evaluation of Expression 을 반환한다. 이 값은 Reference 타입일 수
있다.
참고
이 알고리즘은 Evaluation of Expression 의 결과에
GetValue 를 적용하지 않는다. 그 주요 동기는
delete 및 typeof와 같은 연산자가 괄호로 묶인 표현식에 적용될 수 있도록 하기 위함이다.
13.3 좌변식(Left-Hand-Side Expressions)
구문
MemberExpression [Yield,
Await] :
PrimaryExpression [?Yield,
?Await]
MemberExpression [?Yield,
?Await]
[
Expression [+In, ?Yield,
?Await]
]
MemberExpression [?Yield,
?Await]
.
IdentifierName
MemberExpression [?Yield,
?Await]
TemplateLiteral [?Yield,
?Await, +Tagged]
SuperProperty [?Yield,
?Await]
MetaProperty
new
MemberExpression [?Yield,
?Await]
Arguments [?Yield,
?Await]
MemberExpression [?Yield,
?Await]
.
PrivateIdentifier
SuperProperty [Yield,
Await] :
super
[
Expression [+In, ?Yield,
?Await]
]
super
.
IdentifierName
MetaProperty :
NewTarget
ImportMeta
NewTarget :
new
.
target
ImportMeta :
import
.
meta
NewExpression [Yield,
Await] :
MemberExpression [?Yield,
?Await]
new
NewExpression [?Yield,
?Await]
CallExpression [Yield,
Await] :
CoverCallExpressionAndAsyncArrowHead [?Yield,
?Await]
SuperCall [?Yield,
?Await]
ImportCall [?Yield,
?Await]
CallExpression [?Yield,
?Await]
Arguments [?Yield,
?Await]
CallExpression [?Yield,
?Await]
[
Expression [+In, ?Yield,
?Await]
]
CallExpression [?Yield,
?Await]
.
IdentifierName
CallExpression [?Yield,
?Await]
TemplateLiteral [?Yield,
?Await, +Tagged]
CallExpression [?Yield,
?Await]
.
PrivateIdentifier
SuperCall [Yield,
Await] :
super
Arguments [?Yield,
?Await]
ImportCall [Yield,
Await] :
import
(
AssignmentExpression [+In,
?Yield, ?Await]
,opt
)
import
(
AssignmentExpression [+In,
?Yield, ?Await]
,
AssignmentExpression [+In,
?Yield, ?Await]
,opt
)
Arguments [Yield,
Await] :
(
)
(
ArgumentList [?Yield,
?Await]
)
(
ArgumentList [?Yield,
?Await]
,
)
ArgumentList [Yield,
Await] :
AssignmentExpression [+In,
?Yield, ?Await]
...
AssignmentExpression [+In,
?Yield, ?Await]
ArgumentList [?Yield,
?Await]
,
AssignmentExpression [+In,
?Yield, ?Await]
ArgumentList [?Yield,
?Await]
,
...
AssignmentExpression [+In,
?Yield, ?Await]
OptionalExpression [Yield,
Await] :
MemberExpression [?Yield,
?Await]
OptionalChain [?Yield,
?Await]
CallExpression [?Yield,
?Await]
OptionalChain [?Yield,
?Await]
OptionalExpression [?Yield,
?Await]
OptionalChain [?Yield,
?Await]
OptionalChain [Yield,
Await] :
?.
Arguments [?Yield,
?Await]
?.
[
Expression [+In, ?Yield,
?Await]
]
?.
IdentifierName
?.
TemplateLiteral [?Yield,
?Await, +Tagged]
?.
PrivateIdentifier
OptionalChain [?Yield,
?Await]
Arguments [?Yield,
?Await]
OptionalChain [?Yield,
?Await]
[
Expression [+In, ?Yield,
?Await]
]
OptionalChain [?Yield,
?Await]
.
IdentifierName
OptionalChain [?Yield,
?Await]
TemplateLiteral [?Yield,
?Await, +Tagged]
OptionalChain [?Yield,
?Await]
.
PrivateIdentifier
LeftHandSideExpression [Yield,
Await] :
NewExpression [?Yield,
?Await]
CallExpression [?Yield,
?Await]
OptionalExpression [?Yield,
?Await]
보충 구문
다음 생성식을 처리할 때
CallExpression :
CoverCallExpressionAndAsyncArrowHead
CoverCallExpressionAndAsyncArrowHead 의
해석은 다음 문법을 사용하여 보완된다:
CallMemberExpression [Yield,
Await] :
MemberExpression [?Yield,
?Await]
Arguments [?Yield,
?Await]
13.3.1 정적 의미론
13.3.1.1 정적 의미론: 초기 에러
OptionalChain :
?.
TemplateLiteral
OptionalChain
TemplateLiteral
이 생성식에 의해 소스 텍스트가 일치하는 경우 구문 오류이다.
참고
이 생성식은 다음 코드에 자동 세미콜론 삽입 규칙(12.10 )이 적용되는 것을
방지하기 위해 존재한다:
a?.b
`c`
이 코드는 두 개의 유효한 문장으로 해석되어야 한다. 목적은 선택적 체이닝 없이 유사한 코드와 일관성을 유지하는 것이다:
a.b
`c`
이 코드는 유효한 문장이며, 자동 세미콜론 삽입이 적용되지 않는다.
ImportMeta :
import
.
meta
13.3.2 프로퍼티 접근자
참고
프로퍼티는 점 표기법(dot notation)을 사용하여 이름으로 접근할 수 있다:
또는 대괄호 표기법(bracket notation)을 사용할 수 있다:
점 표기법은 다음 구문 변환에 의해 설명된다:
이는 동작상 다음과 동일하다:
그리고 마찬가지로
이는 동작상 다음과 동일하다:
여기서 <identifier-name-string >은 IdentifierName 의 StringValue 이다.
13.3.2.1 런타임 의미론: 평가
MemberExpression
:
MemberExpression
[
Expression
]
baseReference 를 ? Evaluation of
MemberExpression 의 결과로 한다.
baseValue 를 ? GetValue (baseReference )로 한다.
strict 를 IsStrict (this MemberExpression )로 한다.
? EvaluatePropertyAccessWithExpressionKey (baseValue ,
Expression ,
strict )를 반환한다.
MemberExpression
:
MemberExpression
.
IdentifierName
baseReference 를 ? Evaluation of
MemberExpression 의 결과로 한다.
baseValue 를 ? GetValue (baseReference )로 한다.
strict 를 IsStrict (this MemberExpression )로 한다.
EvaluatePropertyAccessWithIdentifierKey (baseValue ,
IdentifierName ,
strict )를 반환한다.
MemberExpression
:
MemberExpression
.
PrivateIdentifier
baseReference 를 ? Evaluation of
MemberExpression 의 결과로 한다.
baseValue 를 ? GetValue (baseReference )로 한다.
fieldNameString 을 StringValue of
PrivateIdentifier 로 한다.
MakePrivateReference (baseValue ,
fieldNameString )를 반환한다.
CallExpression :
CallExpression
[
Expression
]
baseReference 를 ? Evaluation of
CallExpression 의
결과로 한다.
baseValue 를 ? GetValue (baseReference )로 한다.
strict 를 IsStrict (this CallExpression )로 한다.
? EvaluatePropertyAccessWithExpressionKey (baseValue ,
Expression ,
strict )를 반환한다.
CallExpression :
CallExpression
.
IdentifierName
baseReference 를 ? Evaluation of
CallExpression 의
결과로 한다.
baseValue 를 ? GetValue (baseReference )로 한다.
strict 를 IsStrict (this CallExpression )로 한다.
EvaluatePropertyAccessWithIdentifierKey (baseValue ,
IdentifierName ,
strict )를 반환한다.
CallExpression :
CallExpression
.
PrivateIdentifier
baseReference 를 ? Evaluation of
CallExpression 의
결과로 한다.
baseValue 를 ? GetValue (baseReference )로 한다.
fieldNameString 을 StringValue of
PrivateIdentifier 로 한다.
MakePrivateReference (baseValue ,
fieldNameString )를 반환한다.
13.3.3 EvaluatePropertyAccessWithExpressionKey (
baseValue , expression , strict )
추상 연산 EvaluatePropertyAccessWithExpressionKey는 baseValue (ECMAScript 언어 값 ),
expression (Expression 파스 노드 ), strict
(불리언)를 인수로 받고, 정상 완료(normal
completion) 가 담긴 Reference
Record 또는 비정상 완료(abrupt
completion) 를 반환한다. 실행 시 다음 단계를 수행한다:
propertyNameReference 를 ? Evaluation of
expression 의 결과로 한다.
propertyNameValue 를 ? GetValue (propertyNameReference )로
한다.
참고: 대부분의 경우 ToPropertyKey 가 이 단계 바로 뒤에
propertyNameValue 에 적용된다. 하지만 a[b] = c의 경우 c의 평가가 끝난
뒤에 적용된다.
Reference Record
{ [[Base]] : baseValue , [[ReferencedName]] : propertyNameValue , [[Strict]] : strict , [[ThisValue]] : empty }를 반환한다.
13.3.4 EvaluatePropertyAccessWithIdentifierKey (
baseValue , identifierName , strict )
추상 연산 EvaluatePropertyAccessWithIdentifierKey는 baseValue (ECMAScript 언어 값 ),
identifierName (IdentifierName 파스
노드 ), strict (불리언)를 인수로 받고, Reference Record 를 반환한다.
실행 시 다음 단계를 수행한다:
propertyNameString 을 StringValue of
identifierName 로 한다.
Reference Record
{ [[Base]] : baseValue , [[ReferencedName]] : propertyNameString , [[Strict]] : strict , [[ThisValue]] : empty }를 반환한다.
13.3.5 new 연산자
13.3.5.1 런타임 의미론: 평가
NewExpression :
new
NewExpression
? EvaluateNew (NewExpression ,
empty )를 반환한다.
MemberExpression
:
new
MemberExpression
Arguments
? EvaluateNew (MemberExpression , Arguments )를 반환한다.
13.3.5.1.1 EvaluateNew ( constructExpr ,
arguments )
추상 연산 EvaluateNew는 constructExpr (NewExpression 파스
노드 또는 MemberExpression 파스
노드 )와 arguments (empty 또는
Arguments 파스
노드 )를 인수로 받고, 정상 완료(normal
completion) 가 담긴 ECMAScript 언어
값 또는 비정상 완료(abrupt
completion) 를 반환한다. 실행 시 다음 단계를 수행한다:
ref 를 ? Evaluation of
constructExpr 의 결과로 한다.
constructor 를 ? GetValue (ref )로 한다.
만약 arguments 가 empty 이면,
argList 를 새로운 빈 리스트 로
한다.
그 외에는,
argList 를 ? ArgumentListEvaluation of
arguments 의 결과로 한다.
IsConstructor (constructor )
가 false 이면 TypeError 예외를 throw한다.
? Construct (constructor ,
argList )를 반환한다.
13.3.6 함수 호출
13.3.6.1 런타임 의미론: 평가
CallExpression :
CoverCallExpressionAndAsyncArrowHead
expr 를 CallMemberExpression 로 한다. 이는
포함된 CoverCallExpressionAndAsyncArrowHead 이다.
memberExpr 를 expr 의 MemberExpression 로 한다.
arguments 를 expr 의 Arguments 로 한다.
ref 를 ? Evaluation of
memberExpr 의 결과로 한다.
func 를 ? GetValue (ref )로 한다.
만약 ref 가 Reference
Record 이고, IsPropertyReference (ref )
가 false 이며, ref .[[ReferencedName]] 이 "eval" 이면,
SameValue (func ,
%eval% )가
true 이면,
argList 를 ? ArgumentListEvaluation of
arguments 의 결과로 한다.
argList 에 요소가 없다면 undefined 를 반환한다.
evalArg 를 argList 의 첫 번째 요소로 한다.
IsStrict (this CallExpression )가
true 이면 strictCaller 를
true 로, 그렇지 않으면 strictCaller 를
false 로 한다.
? PerformEval (evalArg ,
strictCaller , true )의 결과를 반환한다.
thisCall 을 this CallExpression 로 한다.
tailCall 을 IsInTailPosition (thisCall )로
한다.
? EvaluateCall (func ,
ref , arguments , tailCall )의 결과를 반환한다.
CallExpression 의 평가가
6.a.v 단계를 실행하면, 이는
직접 eval(direct eval) 이다.
CallExpression :
CallExpression
Arguments
ref 를 ? Evaluation of
CallExpression 의
결과로 한다.
func 를 ? GetValue (ref )로 한다.
thisCall 을 this CallExpression 로 한다.
tailCall 을 IsInTailPosition (thisCall )로
한다.
? EvaluateCall (func ,
ref , Arguments , tailCall )의 결과를
반환한다.
13.3.6.2 EvaluateCall ( func , ref ,
arguments , tailPosition )
추상 연산 EvaluateCall은 func (ECMAScript 언어 값 ),
ref (ECMAScript 언어 값 또는 Reference Record ),
arguments (파스 노드 ), tailPosition (불리언)를
인수로 받고, 정상 완료 가 담긴 ECMAScript 언어 값 또는 비정상 완료 를 반환한다. 호출 시
다음 단계를 수행한다:
ref 가 Reference
Record 라면,
IsPropertyReference (ref )
가 true 라면,
thisValue 를 GetThisValue (ref )로
한다.
그 외에는,
refEnv 를 ref .[[Base]] 로
한다.
Assert : refEnv 는
Environment
Record 이다.
thisValue 를 refEnv .WithBaseObject()로 한다.
그 외에는,
thisValue 를 undefined 로 한다.
argList 를 ? ArgumentListEvaluation of
arguments 의 결과로 한다.
func 가 객체가 아니면 TypeError
예외를 throw한다.
IsCallable (func )가
false 이면 TypeError 예외를 throw한다.
tailPosition 이 true 이면, PrepareForTailCall ()를 수행한다.
? Call (func ,
thisValue , argList )의 결과를 반환한다.
13.3.7 super 키워드
13.3.7.1 런타임 의미론: 평가
SuperProperty :
super
[
Expression
]
env 를 GetThisEnvironment ()로 한다.
actualThis 를 ? env .GetThisBinding()으로 한다.
propertyNameReference 를 ? Evaluation of Expression 의 결과로 한다.
propertyNameValue 를 ? GetValue (propertyNameReference )로
한다.
strict 를 IsStrict (this SuperProperty )로 한다.
참고: 대부분의 경우, ToPropertyKey 가 이 단계 직후
propertyNameValue 에 대해 수행된다. 그러나 super[b] = c의 경우
c의 평가가 끝난 뒤에 수행된다.
MakeSuperPropertyReference (actualThis ,
propertyNameValue , strict )를 반환한다.
SuperProperty :
super
.
IdentifierName
env 를 GetThisEnvironment ()로 한다.
actualThis 를 ? env .GetThisBinding()으로 한다.
propertyKey 를 StringValue of
IdentifierName 로
한다.
strict 를 IsStrict (this SuperProperty )로 한다.
MakeSuperPropertyReference (actualThis ,
propertyKey , strict )를 반환한다.
SuperCall :
super
Arguments
newTarget 를 GetNewTarget ()로 한다.
Assert :
newTarget 는 생성자 이다.
func 를 GetSuperConstructor ()로 한다.
argList 를 ? ArgumentListEvaluation of Arguments 의 결과로 한다.
IsConstructor (func )가
false 이면 TypeError 예외를 throw한다.
result 를 ? Construct (func ,
argList , newTarget )의 결과로 한다.
thisER 를 GetThisEnvironment ()로 한다.
Assert :
thisER 는 함수 환경 레코드(Function
Environment Record) 이다.
? BindThisValue (thisER ,
result )를 수행한다.
F 를 thisER .[[FunctionObject]] 로 한다.
Assert :
F 는 ECMAScript 함수 객체(function object) 이다.
? InitializeInstanceElements (result ,
F )를 수행한다.
result 를 반환한다.
13.3.7.2 GetSuperConstructor ( )
추상 연산 GetSuperConstructor는 인수를 받지 않으며 ECMAScript 언어 값 을
반환한다. 호출 시 다음 단계를 수행한다:
envRec 를 GetThisEnvironment ()로 한다.
Assert :
envRec 는 함수 환경 레코드(Function
Environment Record) 이다.
activeFunction 을 envRec .[[FunctionObject]] 로 한다.
Assert :
activeFunction 은 ECMAScript 함수 객체(function
object) 이다.
superConstructor 를 ! activeFunction .[[GetPrototypeOf]] ()의 결과로 한다.
superConstructor 를 반환한다.
13.3.7.3 MakeSuperPropertyReference ( actualThis ,
propertyKey , strict )
추상 연산 MakeSuperPropertyReference는 actualThis (ECMAScript 언어 값 ),
propertyKey (ECMAScript 언어 값 ),
strict (불리언)를 인수로 받고, Super Reference Record 를 반환한다. 호출 시 다음
단계를 수행한다:
env 를 GetThisEnvironment ()로 한다.
Assert :
env .HasSuperBinding()이 true 이다.
Assert :
env 는 함수 환경 레코드(Function Environment
Record) 이다.
baseValue 를 GetSuperBase (env )로 한다.
Reference
Record { [[Base]] :
baseValue , [[ReferencedName]] :
propertyKey , [[Strict]] : strict , [[ThisValue]] : actualThis }를 반환한다.
13.3.8 인수 목록
참고
인수 목록의 평가는 값들의 리스트 를 생성한다.
13.3.8.1 런타임 의미론: ArgumentListEvaluation
구문 지향 연산
ArgumentListEvaluation은 인수를 받지 않으며, 리스트 에 담긴
ECMAScript 언어 값 들의 정상 완료(normal
completion) 또는 비정상 완료(abrupt
completion) 를 반환한다. 다음 생산식에 대해 부분적으로 정의된다:
Arguments :
(
)
새로운 빈 리스트 를 반환한다.
ArgumentList :
AssignmentExpression
ref 를 ? Evaluation of
AssignmentExpression 의 결과로 한다.
arg 를 ? GetValue (ref )로 한다.
« arg »를 반환한다.
ArgumentList :
...
AssignmentExpression
list 를 새로운 빈 리스트 로 한다.
spreadRef 를 ? Evaluation of
AssignmentExpression 의 결과로 한다.
spreadObj 를 ? GetValue (spreadRef )로 한다.
iteratorRecord 를 ? GetIterator (spreadObj ,
sync )로 한다.
반복,
next 를 ? IteratorStepValue (iteratorRecord )로
한다.
next 가 done 이면 list 를 반환한다.
next 를 list 에 추가한다.
ArgumentList :
ArgumentList
,
AssignmentExpression
precedingArgs 를 ? ArgumentListEvaluation of ArgumentList 의 결과로 한다.
ref 를 ? Evaluation of
AssignmentExpression 의 결과로 한다.
arg 를 ? GetValue (ref )로 한다.
precedingArgs 와 « arg »의 리스트 결합 을 반환한다.
ArgumentList :
ArgumentList
,
...
AssignmentExpression
precedingArgs 를 ? ArgumentListEvaluation of ArgumentList 의 결과로 한다.
spreadRef 를 ? Evaluation of
AssignmentExpression 의 결과로 한다.
iteratorRecord 를 ? GetIterator (?
GetValue (spreadRef ),
sync )로 한다.
반복,
next 를 ? IteratorStepValue (iteratorRecord )로
한다.
next 가 done 이면
precedingArgs 를 반환한다.
next 를 precedingArgs 에 추가한다.
TemplateLiteral
: NoSubstitutionTemplate
templateLiteral 을 this TemplateLiteral 로 한다.
siteObj 를 GetTemplateObject (templateLiteral )로
한다.
« siteObj »를 반환한다.
TemplateLiteral
: SubstitutionTemplate
templateLiteral 을 this TemplateLiteral 로 한다.
siteObj 를 GetTemplateObject (templateLiteral )로
한다.
remaining 을 ? ArgumentListEvaluation of SubstitutionTemplate 의 결과로 한다.
« siteObj »와 remaining 의 리스트 결합 을 반환한다.
SubstitutionTemplate
:
TemplateHead
Expression
TemplateSpans
firstSubRef 를 ? Evaluation of
Expression 의 결과로 한다.
firstSub 를 ? GetValue (firstSubRef )로 한다.
restSub 를 ? SubstitutionEvaluation of TemplateSpans 의 결과로
한다.
Assert :
restSub 는 비어 있을 수도 있는 리스트 이다.
« firstSub »와 restSub 의 리스트 결합 을 반환한다.
13.3.9 옵셔널 체이닝
참고
옵셔널 체이닝은 하나 이상의 프로퍼티 접근 또는 함수 호출로 이루어진 체인으로, 그 첫 번째가 ?.
토큰으로 시작한다.
13.3.9.1 런타임 의미론: 평가
OptionalExpression
:
MemberExpression
OptionalChain
baseReference 를 ? Evaluation of
MemberExpression 의 결과로 한다.
baseValue 를 ? GetValue (baseReference )로 한다.
만약 baseValue 가 undefined 또는 null 이면,
undefined 를 반환한다.
? ChainEvaluation of OptionalChain 에
baseValue 와 baseReference 를 인수로 하여 호출한 결과를 반환한다.
OptionalExpression
:
CallExpression
OptionalChain
baseReference 를 ? Evaluation of
CallExpression 의
결과로 한다.
baseValue 를 ? GetValue (baseReference )로 한다.
만약 baseValue 가 undefined 또는 null 이면,
undefined 를 반환한다.
? ChainEvaluation of OptionalChain 에
baseValue 와 baseReference 를 인수로 하여 호출한 결과를 반환한다.
OptionalExpression
:
OptionalExpression
OptionalChain
baseReference 를 ? Evaluation of
OptionalExpression 의 결과로 한다.
baseValue 를 ? GetValue (baseReference )로 한다.
만약 baseValue 가 undefined 또는 null 이면,
undefined 를 반환한다.
? ChainEvaluation of OptionalChain 에
baseValue 와 baseReference 를 인수로 하여 호출한 결과를 반환한다.
13.3.9.2 런타임 의미론: ChainEvaluation
구문 지향 연산
ChainEvaluation은 baseValue (ECMAScript 언어 값 ),
baseReference (ECMAScript 언어 값 또는 Reference Record )를
인수로 받고, 정상 완료(normal
completion) 가 담긴 ECMAScript 언어 값
또는 Reference Record 또는
비정상 완료(abrupt
completion) 를 반환한다. 다음 생산식에 대해 부분적으로 정의된다:
OptionalChain :
?.
Arguments
thisChain 을 this OptionalChain 로 한다.
tailCall 을 IsInTailPosition (thisChain )로
한다.
? EvaluateCall (baseValue ,
baseReference , Arguments , tailCall )의 결과를
반환한다.
OptionalChain :
?.
[
Expression
]
strict 를 IsStrict (this OptionalChain )로 한다.
? EvaluatePropertyAccessWithExpressionKey (baseValue ,
Expression ,
strict )의 결과를 반환한다.
OptionalChain :
?.
IdentifierName
strict 를 IsStrict (this OptionalChain )로 한다.
EvaluatePropertyAccessWithIdentifierKey (baseValue ,
IdentifierName ,
strict )의 결과를 반환한다.
OptionalChain :
?.
PrivateIdentifier
fieldNameString 을 StringValue of
PrivateIdentifier 로 한다.
MakePrivateReference (baseValue ,
fieldNameString )의 결과를 반환한다.
OptionalChain :
OptionalChain
Arguments
optionalChain 을 OptionalChain 로 한다.
newReference 를 ? ChainEvaluation of
optionalChain 에 baseValue 와 baseReference 를 인수로 하여 호출한
결과로 한다.
newValue 를 ? GetValue (newReference )로 한다.
thisChain 을 this OptionalChain 로 한다.
tailCall 을 IsInTailPosition (thisChain )로
한다.
? EvaluateCall (newValue ,
newReference , Arguments , tailCall )의 결과를
반환한다.
OptionalChain :
OptionalChain
[
Expression
]
optionalChain 을 OptionalChain 로 한다.
newReference 를 ? ChainEvaluation of
optionalChain 에 baseValue 와 baseReference 를 인수로 하여 호출한
결과로 한다.
newValue 를 ? GetValue (newReference )로 한다.
strict 를 IsStrict (this OptionalChain )로 한다.
? EvaluatePropertyAccessWithExpressionKey (newValue ,
Expression ,
strict )의 결과를 반환한다.
OptionalChain :
OptionalChain
.
IdentifierName
optionalChain 을 OptionalChain 로 한다.
newReference 를 ? ChainEvaluation of
optionalChain 에 baseValue 와 baseReference 를 인수로 하여 호출한
결과로 한다.
newValue 를 ? GetValue (newReference )로 한다.
strict 를 IsStrict (this OptionalChain )로 한다.
EvaluatePropertyAccessWithIdentifierKey (newValue ,
IdentifierName ,
strict )의 결과를 반환한다.
OptionalChain :
OptionalChain
.
PrivateIdentifier
optionalChain 을 OptionalChain 로 한다.
newReference 를 ? ChainEvaluation of
optionalChain 에 baseValue 와 baseReference 를 인수로 하여 호출한
결과로 한다.
newValue 를 ? GetValue (newReference )로 한다.
fieldNameString 을 StringValue of
PrivateIdentifier 로 한다.
MakePrivateReference (newValue ,
fieldNameString )의 결과를 반환한다.
13.3.10 import 호출
13.3.10.1 런타임 의미론: 평가
ImportCall :
import
(
AssignmentExpression
,opt
)
? EvaluateImportCall (AssignmentExpression )을 반환한다.
ImportCall :
import
(
AssignmentExpression
,
AssignmentExpression
,opt
)
? EvaluateImportCall (첫 번째 AssignmentExpression , 두 번째
AssignmentExpression )을 반환한다.
13.3.10.2 EvaluateImportCall ( specifierExpression [
, optionsExpression ] )
추상 연산 EvaluateImportCall은 specifierExpression (파스
노드 )와 선택적 인수 optionsExpression (파스
노드 )를 인수로 받고, 프로미스가 담긴 정상 완료(normal
completion) 또는 비정상 완료(abrupt
completion) 를 반환한다. 호출 시 다음 단계를 수행한다:
referrer 를 GetActiveScriptOrModule ()로
한다.
referrer 가 null 이면 referrer 를 현재 Realm
Record 로 설정한다.
specifierRef 를 ? Evaluation of
specifierExpression 의 결과로 한다.
specifier 를 ? GetValue (specifierRef )로 한다.
optionsExpression이 존재하면,
optionsRef 를 ? Evaluation
of
optionsExpression 의 결과로 한다.
options 를 ? GetValue (optionsRef )로
한다.
그 외에는,
options 를 undefined 로 한다.
promiseCapability 를 ! NewPromiseCapability (%Promise% )로 한다.
specifierString 을 Completion (ToString (specifier ))로 한다.
IfAbruptRejectPromise (specifierString ,
promiseCapability )를 수행한다.
attributes 를 새로운 빈 리스트 로 한다.
options 가 undefined 가 아니면,
options 가 객체가 아니면 ,
! Call (promiseCapability .[[Reject]] , undefined , «
새로 생성된 TypeError 객체 »)를 수행한다.
promiseCapability .[[Promise]] 를
반환한다.
attributesObj 를 Completion (Get (options ,
"with" ))로 한다.
IfAbruptRejectPromise (attributesObj ,
promiseCapability )를 수행한다.
attributesObj가 undefined 가 아니면,
attributesObj가 객체가 아니면 ,
! Call (promiseCapability .[[Reject]] ,
undefined , « 새로 생성된
TypeError 객체 »)를 수행한다.
promiseCapability .[[Promise]] 를 반환한다.
entries 를 Completion (EnumerableOwnProperties (attributesObj ,
key+value ))로 한다.
IfAbruptRejectPromise (entries ,
promiseCapability )를 수행한다.
entries의 각 요소 entry 에 대해,
key 를 ! Get (entry ,
"0" )로 한다.
value 를 ! Get (entry ,
"1" )로 한다.
key가 문자열이면 ,
value가 문자열이
아니면 ,
! Call (promiseCapability .[[Reject]] ,
undefined , « 새로 생성된
TypeError
객체 »)를 수행한다.
promiseCapability .[[Promise]] 를 반환한다.
ImportAttribute
Record { [[Key]] : key ,
[[Value]] :
value }를 attributes 에 추가한다.
AllImportAttributesSupported (attributes )
가 false 라면,
! Call (promiseCapability .[[Reject]] , undefined , «
새로 생성된 TypeError 객체 »)를 수행한다.
promiseCapability .[[Promise]] 를
반환한다.
attributes를 각 [[Key]] 필드 값을 UTF-16 코드 유닛의 시퀀스로 취급하여
사전식(lexicographic)으로 정렬한다. 참고: 이 정렬은 호스트 가 속성의 열거 순서에 따라 동작을 바꾸지
못하도록 금지하는 목적에서만 관찰 가능하다.
moduleRequest 를 ModuleRequest
Record { [[Specifier]] :
specifierString , [[Attributes]] :
attributes }로 한다.
HostLoadImportedModule (referrer ,
moduleRequest , empty ,
promiseCapability )를 수행한다.
promiseCapability .[[Promise]] 를 반환한다.
13.3.10.3 ContinueDynamicImport ( promiseCapability ,
moduleCompletion )
추상 연산 ContinueDynamicImport는 promiseCapability (PromiseCapability Record ),
moduleCompletion (정상 완료(normal
completion) 가 담긴 Module Record 또는
throw completion )를
인수로 받고 unused 를 반환한다. 이는 import() 호출로 시작된
동적 import의 처리를 완료하며, 그 호출이 반환한 프로미스를 적절히 resolve 또는 reject 한다. 호출 시 다음 단계를 수행한다:
moduleCompletion 이 비정상 완료(abrupt
completion) 라면,
! Call (promiseCapability .[[Reject]] , undefined , «
moduleCompletion .[[Value]] »)를 수행한다.
unused 를 반환한다.
module 을 moduleCompletion .[[Value]] 로
한다.
loadPromise 를 module .LoadRequestedModules()로 한다.
rejectedClosure 를 매개변수 (reason )를 가지며
promiseCapability 를 캡처하고, 호출 시 다음 단계를 수행하는 새로운 Abstract Closure 로 한다:
! Call (promiseCapability .[[Reject]] , undefined , «
reason »)를 수행한다.
NormalCompletion (undefined )을
반환한다.
onRejected 를 CreateBuiltinFunction (rejectedClosure ,
1, "" , « »)로 한다.
linkAndEvaluateClosure 를 매개변수 없이 module ,
promiseCapability , onRejected 를 캡처하고, 호출 시 다음 단계를 수행하는 새로운
Abstract Closure 로 한다:
link 를 Completion (module .Link())로
한다.
link 가 비정상
완료(abrupt completion) 라면,
! Call (promiseCapability .[[Reject]] , undefined , «
link .[[Value]] »)를 수행한다.
NormalCompletion (undefined )을
반환한다.
evaluatePromise 를 module .Evaluate()로 한다.
fulfilledClosure 를 매개변수 없이 module 과
promiseCapability 를 캡처하고, 호출 시 다음 단계를 수행하는 새로운 Abstract Closure 로 한다:
namespace 를 GetModuleNamespace (module )로
한다.
! Call (promiseCapability .[[Resolve]] , undefined , «
namespace »)를 수행한다.
NormalCompletion (undefined )을
반환한다.
onFulfilled 를 CreateBuiltinFunction (fulfilledClosure ,
0, "" , « »)로 한다.
PerformPromiseThen (evaluatePromise ,
onFulfilled , onRejected )를 수행한다.
unused 를 반환한다.
linkAndEvaluate 를 CreateBuiltinFunction (linkAndEvaluateClosure ,
0, "" , « »)로 한다.
PerformPromiseThen (loadPromise ,
linkAndEvaluate , onRejected )를 수행한다.
unused 를 반환한다.
13.3.11 태그드 템플릿
참고
태그드 템플릿은 함수 호출로, 호출의 인수들은 TemplateLiteral
(13.2.8 )에서 유도된다. 실제 인수에는 템플릿
객체(13.2.8.4 )와 TemplateLiteral 내에 포함된
표현식들을 평가하여 얻은 값들이 포함된다.
13.3.11.1 런타임 의미론: 평가
MemberExpression
:
MemberExpression
TemplateLiteral
tagRef 를 ? Evaluation of
MemberExpression 의 결과로 한다.
tagFunc 를 ? GetValue (tagRef )로 한다.
thisCall 을 this MemberExpression 로 한다.
tailCall 을 IsInTailPosition (thisCall )로
한다.
? EvaluateCall (tagFunc ,
tagRef , TemplateLiteral ,
tailCall )의 결과를 반환한다.
CallExpression :
CallExpression
TemplateLiteral
tagRef 를 ? Evaluation of
CallExpression 의
결과로 한다.
tagFunc 를 ? GetValue (tagRef )로 한다.
thisCall 을 this CallExpression 로 한다.
tailCall 을 IsInTailPosition (thisCall )로
한다.
? EvaluateCall (tagFunc ,
tagRef , TemplateLiteral ,
tailCall )의 결과를 반환한다.
13.3.12 메타 프로퍼티
13.3.12.1 런타임 의미론: 평가
NewTarget :
new
.
target
GetNewTarget ()를 반환한다.
ImportMeta :
import
.
meta
module 을 GetActiveScriptOrModule ()로
한다.
Assert :
module 은 소스 텍스트 모듈 레코드(Source Text Module
Record) 이다.
importMeta 를 module .[[ImportMeta]] 로
한다.
importMeta 가 empty 이면,
importMeta 를 OrdinaryObjectCreate (null )로
설정한다.
importMetaValues 를 HostGetImportMetaProperties (module )로
한다.
importMetaValues 의 각 Record
{ [[Key]] , [[Value]] }
p 에 대해,
! CreateDataPropertyOrThrow (importMeta ,
p .[[Key]] , p .[[Value]] )를 수행한다.
HostFinalizeImportMeta (importMeta ,
module )를 수행한다.
module .[[ImportMeta]] 를
importMeta 로 설정한다.
importMeta 를 반환한다.
그 외에는,
Assert : importMeta
객체이다 .
importMeta 를 반환한다.
13.3.12.1.1 HostGetImportMetaProperties (
moduleRecord )
호스트
정의 추상 연산 HostGetImportMetaProperties는 moduleRecord
(모듈 레코드(Module Record) )를 인수로
받고, 리스트(List) 를 반환한다.
리스트는 Record 들로 구성되며, 각
Record는 [[Key]] (프로퍼티 키 )와 [[Value]] (ECMAScript 언어
값 ) 필드를 가진다. 이 연산은 호스트 가 import.meta에서 반환되는 객체에 프로퍼티 키와 값을
제공할 수 있도록 한다.
HostGetImportMetaProperties의 기본 구현은 새로운 빈 리스트(List) 를 반환한다.
13.3.12.1.2 HostFinalizeImportMeta ( importMeta ,
moduleRecord )
호스트
정의 추상 연산 HostFinalizeImportMeta는 importMeta (객체)와
moduleRecord (모듈 레코드(Module Record) )를 인수로
받고 unused 를 반환한다. 이 연산은 호스트 가 import.meta에서 반환되는 객체를 ECMAScript
코드에 노출하기 전에 특별한 처리를 할 수 있도록 한다.
대부분의 호스트 는 HostGetImportMetaProperties 만
정의하고, HostFinalizeImportMeta는 기본 동작을 사용하면 된다. 그러나 HostFinalizeImportMeta는 호스트 가 객체를 직접 조작해야 할 경우를 위한
"탈출구"를 제공한다.
HostFinalizeImportMeta의 기본 구현은 unused 를 반환한다.
13.4 증감식
구문
UpdateExpression [Yield,
Await] :
LeftHandSideExpression [?Yield,
?Await]
LeftHandSideExpression [?Yield,
?Await]
[여기에 LineTerminator 없음]
++
LeftHandSideExpression [?Yield,
?Await]
[여기에 LineTerminator 없음]
--
++
UnaryExpression [?Yield,
?Await]
--
UnaryExpression [?Yield,
?Await]
13.4.1 정적 의미론: 초기 에러
UpdateExpression :
LeftHandSideExpression
++
LeftHandSideExpression
--
UpdateExpression :
++
UnaryExpression
--
UnaryExpression
13.4.2 후위 증가 연산자
13.4.2.1 런타임 의미론: 평가
UpdateExpression
:
LeftHandSideExpression
++
lhs 를 ? Evaluation of
LeftHandSideExpression 의 결과로
한다.
LeftHandSideExpression 의
AssignmentTargetType 이
web-compat 이면, ReferenceError 예외를 발생시킨다.
oldValue 를 ? ToNumeric (?
GetValue (lhs ))로 한다.
oldValue 가 Number 이면,
newValue 를 Number::add (oldValue ,
1 𝔽 )로 한다.
그 외에는,
Assert : oldValue 는 BigInt 이다.
newValue 를 BigInt::add (oldValue ,
1 ℤ )로 한다.
? PutValue (lhs ,
newValue )를 수행한다.
oldValue 를 반환한다.
13.4.3 후위 감소 연산자
13.4.3.1 런타임 의미론: 평가
UpdateExpression
:
LeftHandSideExpression
--
lhs 를 ? Evaluation of
LeftHandSideExpression 의 결과로
한다.
LeftHandSideExpression 의
AssignmentTargetType 이
web-compat 이면, ReferenceError 예외를 발생시킨다.
oldValue 를 ? ToNumeric (?
GetValue (lhs ))로 한다.
oldValue 가 Number 이면,
newValue 를 Number::subtract (oldValue ,
1 𝔽 )로 한다.
그 외에는,
Assert : oldValue 는 BigInt 이다.
newValue 를 BigInt::subtract (oldValue ,
1 ℤ )로 한다.
? PutValue (lhs ,
newValue )를 수행한다.
oldValue 를 반환한다.
13.4.4 전위 증가 연산자
13.4.4.1 런타임 의미론: 평가
UpdateExpression
:
++
UnaryExpression
expr 를 ? Evaluation of
UnaryExpression 의 결과로 한다.
UnaryExpression 의 AssignmentTargetType 이
web-compat 이면, ReferenceError 예외를 발생시킨다.
oldValue 를 ? ToNumeric (?
GetValue (expr ))로 한다.
oldValue 가 Number 이면,
newValue 를 Number::add (oldValue ,
1 𝔽 )로 한다.
그 외에는,
Assert : oldValue 는 BigInt 이다.
newValue 를 BigInt::add (oldValue ,
1 ℤ )로 한다.
? PutValue (expr ,
newValue )를 수행한다.
newValue 를 반환한다.
13.4.5 전위 감소 연산자
13.4.5.1 런타임 의미론: 평가
UpdateExpression
:
--
UnaryExpression
expr 를 ? Evaluation of
UnaryExpression 의 결과로 한다.
UnaryExpression 의 AssignmentTargetType 이
web-compat 이면, ReferenceError 예외를 발생시킨다.
oldValue 를 ? ToNumeric (?
GetValue (expr ))로 한다.
oldValue 가 Number 이면,
newValue 를 Number::subtract (oldValue ,
1 𝔽 )로 한다.
그 외에는,
Assert : oldValue 는 BigInt 이다.
newValue 를 BigInt::subtract (oldValue ,
1 ℤ )로 한다.
? PutValue (expr ,
newValue )를 수행한다.
newValue 를 반환한다.
13.5 단항 연산자
구문
UnaryExpression [Yield,
Await] :
UpdateExpression [?Yield,
?Await]
delete
UnaryExpression [?Yield,
?Await]
void
UnaryExpression [?Yield,
?Await]
typeof
UnaryExpression [?Yield,
?Await]
+
UnaryExpression [?Yield,
?Await]
-
UnaryExpression [?Yield,
?Await]
~
UnaryExpression [?Yield,
?Await]
!
UnaryExpression [?Yield,
?Await]
[+Await]
AwaitExpression [?Yield]
13.5.1 delete 연산자
13.5.1.1 정적 의미론: 초기 에러
UnaryExpression
:
delete
UnaryExpression
참고
마지막 규칙은 delete (((foo)))와 같은 표현식이 첫 번째 규칙의 재귀적 적용으로 인해 초기 에러 를
발생시킴을 의미한다.
13.5.1.2 런타임 의미론: 평가
UnaryExpression
:
delete
UnaryExpression
ref 를 ? Evaluation of
UnaryExpression 의 결과로 한다.
ref 가 Reference
Record 가 아니면, true 를 반환한다.
IsUnresolvableReference (ref )
가 true 이면,
Assert : ref .[[Strict]] 가 false 이다.
true 를 반환한다.
IsPropertyReference (ref )
가 true 이면,
Assert : IsPrivateReference (ref )
가 false 이다.
IsSuperReference (ref )
가 true 이면, ReferenceError 예외를 발생시킨다.
baseObj 를 ? ToObject (ref .[[Base]] )로 한다.
ref .[[ReferencedName]] 가 프로퍼티
키 가 아니면,
ref .[[ReferencedName]] 를
? ToPropertyKey (ref .[[ReferencedName]] )로 설정한다.
deleteStatus 를 ? baseObj .[[Delete]] (ref .[[ReferencedName]] )로 한다.
deleteStatus 가 false 이고
ref .[[Strict]] 가
true 이면, TypeError 예외를 발생시킨다.
deleteStatus 를 반환한다.
그 외에는,
base 를 ref .[[Base]] 로 한다.
Assert : base 는 Environment Record 이다.
? base .DeleteBinding (ref .[[ReferencedName]] )을 반환한다.
참고 1
delete 연산자가 strict mode 코드 내에서 등장하면, 그
UnaryExpression 이 변수, 함수 인수, 또는 함수
이름에 대한 직접 참조인 경우 SyntaxError 예외가 발생한다. 또한, delete
연산자가 strict mode 코드 내에 있고 삭제 대상 프로퍼티의
속성이 { [[Configurable]] : false }(또는 삭제할 수
없는 경우)이면 TypeError 예외가 발생한다.
참고 2
4.c 단계에서 생성될 수 있는 객체는
위의 추상 연산과 일반 객체 [[Delete]] 내부 메서드 외부에서는 접근할 수 없다. 실제 구현에서는 실제로 객체를 생성하지 않을
수도 있다.
13.5.2 void 연산자
13.5.2.1 런타임 의미론: 평가
UnaryExpression
:
void
UnaryExpression
expr 를 ? Evaluation of
UnaryExpression 의 결과로 한다.
? GetValue (expr )를 수행한다.
undefined 를 반환한다.
참고
GetValue 는 그 값이 사용되지 않더라도 관찰 가능한 부작용이 있을
수 있으므로 반드시 호출되어야 한다.
13.5.3 typeof 연산자
13.5.3.1 런타임 의미론: 평가
UnaryExpression
:
typeof
UnaryExpression
val 를 ? Evaluation of
UnaryExpression 의 결과로 한다.
val 이 Reference
Record 이면,
IsUnresolvableReference (val )
가 true 이면 "undefined" 를 반환한다.
val 를 ? GetValue (val )로 한다.
val 이 undefined 이면 "undefined" 를 반환한다.
val 이 null 이면 "object" 를 반환한다.
val 이 String 이면
"string" 를 반환한다.
val 이 Symbol 이면
"symbol" 를 반환한다.
val 이 Boolean 이면
"boolean" 를 반환한다.
val 이 Number 이면
"number" 를 반환한다.
val 이 BigInt 이면
"bigint" 를 반환한다.
Assert :
val 은 객체 이다.
참고: 이 단계는 B.3.6.3 절에서 대체된다.
val 에 [[Call]] 내부 메서드가 있으면
"function" 를 반환한다.
"object" 를 반환한다.
13.5.4 단항 + 연산자
참고
단항 + 연산자는 피연산자를 Number
타입 으로 변환한다.
13.5.4.1 런타임 의미론: 평가
UnaryExpression
:
+
UnaryExpression
expr 를 ? Evaluation of
UnaryExpression 의 결과로 한다.
? ToNumber (? GetValue (expr ))를 반환한다.
13.5.5 단항 - 연산자
참고
단항 - 연산자는 피연산자를 숫자 값으로 변환한 뒤 부호를 반전시킨다. +0 𝔽 의
부호를 반전하면 -0 𝔽 이 되고, -0 𝔽 의 부호를
반전하면 +0 𝔽 이 된다.
13.5.5.1 런타임 의미론: 평가
UnaryExpression
:
-
UnaryExpression
expr 를 ? Evaluation of
UnaryExpression 의 결과로 한다.
oldValue 를 ? ToNumeric (?
GetValue (expr ))로 한다.
oldValue 가 Number 이면,
Number::unaryMinus (oldValue )를
반환한다.
그 외에는,
Assert : oldValue 는 BigInt 이다.
BigInt::unaryMinus (oldValue )를
반환한다.
13.5.6 비트 NOT 연산자 (~)
13.5.6.1 런타임 의미론: 평가
UnaryExpression
:
~
UnaryExpression
expr 를 ? Evaluation of
UnaryExpression 의 결과로 한다.
oldValue 를 ? ToNumeric (?
GetValue (expr ))로 한다.
oldValue 가 Number 이면,
Number::bitwiseNOT (oldValue )를
반환한다.
그 외에는,
Assert : oldValue 는 BigInt 이다.
BigInt::bitwiseNOT (oldValue )를
반환한다.
13.5.7 논리 NOT 연산자 (!)
13.5.7.1 런타임 의미론: 평가
UnaryExpression
:
!
UnaryExpression
expr 를 ? Evaluation of
UnaryExpression 의 결과로 한다.
oldValue 를 ToBoolean (? GetValue (expr ))로 한다.
oldValue 가 true 이면 false 를 반환한다.
true 를 반환한다.
13.6 거듭제곱 연산자
구문
ExponentiationExpression [Yield,
Await] :
UnaryExpression [?Yield,
?Await]
UpdateExpression [?Yield,
?Await]
**
ExponentiationExpression [?Yield,
?Await]
13.6.1 런타임 의미론: 평가
ExponentiationExpression
:
UpdateExpression
**
ExponentiationExpression
? EvaluateStringOrNumericBinaryExpression (UpdateExpression ,
**, ExponentiationExpression )를
반환한다.
13.7 곱셈 연산자
구문
MultiplicativeExpression [Yield,
Await] :
ExponentiationExpression [?Yield,
?Await]
MultiplicativeExpression [?Yield,
?Await]
MultiplicativeOperator
ExponentiationExpression [?Yield,
?Await]
MultiplicativeOperator
: one of * /
%
참고
* 연산자는 곱셈을 수행하여 피연산자의 곱을 생성한다.
/ 연산자는 나눗셈을 수행하여 피연산자의 몫을 생성한다.
% 연산자는 암묵적 나눗셈에서 피연산자의 나머지를 반환한다.
13.7.1 런타임 의미론: 평가
MultiplicativeExpression
:
MultiplicativeExpression
MultiplicativeOperator
ExponentiationExpression
opText 를 소스 텍스트에서
일치하는 MultiplicativeOperator 의 값으로 한다.
? EvaluateStringOrNumericBinaryExpression (MultiplicativeExpression ,
opText , ExponentiationExpression )를
반환한다.
13.8 덧셈 연산자
구문
AdditiveExpression [Yield,
Await] :
MultiplicativeExpression [?Yield,
?Await]
AdditiveExpression [?Yield,
?Await]
+
MultiplicativeExpression [?Yield,
?Await]
AdditiveExpression [?Yield,
?Await]
-
MultiplicativeExpression [?Yield,
?Await]
13.8.1 덧셈 연산자 (+)
참고
덧셈 연산자는 문자열 연결 또는 숫자 덧셈을 수행한다.
13.8.1.1 런타임 의미론: 평가
AdditiveExpression
:
AdditiveExpression
+
MultiplicativeExpression
? EvaluateStringOrNumericBinaryExpression (AdditiveExpression ,
+, MultiplicativeExpression )를
반환한다.
13.8.2 뺄셈 연산자 (-)
참고
- 연산자는 뺄셈을 수행하여 피연산자의 차를 생성한다.
13.8.2.1 런타임 의미론: 평가
AdditiveExpression
:
AdditiveExpression
-
MultiplicativeExpression
? EvaluateStringOrNumericBinaryExpression (AdditiveExpression ,
-, MultiplicativeExpression )를
반환한다.
13.9 비트 시프트 연산자
구문
ShiftExpression [Yield,
Await] :
AdditiveExpression [?Yield,
?Await]
ShiftExpression [?Yield,
?Await]
<<
AdditiveExpression [?Yield,
?Await]
ShiftExpression [?Yield,
?Await]
>>
AdditiveExpression [?Yield,
?Await]
ShiftExpression [?Yield,
?Await]
>>>
AdditiveExpression [?Yield,
?Await]
13.9.1 왼쪽 시프트 연산자 (<<)
참고
왼쪽 피연산자를 오른쪽 피연산자가 지정한 만큼 비트 단위로 왼쪽으로 시프트(이동)한다.
13.9.1.1 런타임 의미론: 평가
ShiftExpression
:
ShiftExpression
<<
AdditiveExpression
? EvaluateStringOrNumericBinaryExpression (ShiftExpression ,
<<, AdditiveExpression )를 반환한다.
13.9.2 부호 있는 오른쪽 시프트 연산자 (>>)
참고
왼쪽 피연산자를 오른쪽 피연산자가 지정한 만큼 부호 비트를 채우며 비트 단위로 오른쪽으로 시프트(이동)한다.
13.9.2.1 런타임 의미론: 평가
ShiftExpression
:
ShiftExpression
>>
AdditiveExpression
? EvaluateStringOrNumericBinaryExpression (ShiftExpression ,
>>, AdditiveExpression )를 반환한다.
13.9.3 부호 없는 오른쪽 시프트 연산자 (>>>
)
참고
왼쪽 피연산자를 오른쪽 피연산자가 지정한 만큼 0으로 채우며 비트 단위로 오른쪽으로 시프트(이동)한다.
13.9.3.1 런타임 의미론: 평가
ShiftExpression
:
ShiftExpression
>>>
AdditiveExpression
? EvaluateStringOrNumericBinaryExpression (ShiftExpression ,
>>>, AdditiveExpression )를 반환한다.
13.10 관계 연산자
참고 1
관계 연산자를 평가한 결과는 항상 Boolean 타입이며, 피연산자 간의 관계가 연산자가 지정한 관계를 만족하는지 여부를 나타낸다.
구문
RelationalExpression [In,
Yield, Await] :
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
<
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
>
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
<=
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
>=
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
instanceof
ShiftExpression [?Yield,
?Await]
[+In]
RelationalExpression [+In,
?Yield, ?Await]
in
ShiftExpression [?Yield,
?Await]
[+In]
PrivateIdentifier
in
ShiftExpression [?Yield,
?Await]
참고 2
[In] 문법 매개변수는 관계식에서 in 연산자와 for 문에서의 in
연산자를 혼동하지 않도록 필요하다.
13.10.1 런타임 의미론: 평가
RelationalExpression
:
RelationalExpression
<
ShiftExpression
lRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of ShiftExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
r 를 ? IsLessThan (lVal , rVal ,
true )로 한다.
r 가 undefined 이면 false 를, 아니면
r 를 반환한다.
RelationalExpression
:
RelationalExpression
>
ShiftExpression
lRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of ShiftExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
r 를 ? IsLessThan (rVal , lVal ,
false )로 한다.
r 가 undefined 이면 false 를, 아니면
r 를 반환한다.
RelationalExpression
:
RelationalExpression
<=
ShiftExpression
lRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of ShiftExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
r 를 ? IsLessThan (rVal , lVal ,
false )로 한다.
r 가 true 또는 undefined 이면
false 를, 아니면 true 를 반환한다.
RelationalExpression
:
RelationalExpression
>=
ShiftExpression
lRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of ShiftExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
r 를 ? IsLessThan (lVal , rVal ,
true )로 한다.
r 가 true 또는 undefined 이면
false 를, 아니면 true 를 반환한다.
RelationalExpression
:
RelationalExpression
instanceof
ShiftExpression
lRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of ShiftExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
? InstanceofOperator (lVal ,
rVal )를 반환한다.
RelationalExpression
:
RelationalExpression
in
ShiftExpression
lRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of ShiftExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
rVal 이 객체가 아니면 , TypeError 예외를
throw한다.
? HasProperty (rVal , ? ToPropertyKey (lVal ))를 반환한다.
RelationalExpression
:
PrivateIdentifier
in
ShiftExpression
privateIdentifier 를 StringValue of PrivateIdentifier 로
한다.
rRef 를 ? Evaluation of ShiftExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
rVal 이 객체가 아니면 , TypeError 예외를
throw한다.
privateEnv 를 실행 중인 실행 컨텍스트(running execution
context) 의 PrivateEnvironment로 한다.
Assert :
privateEnv 는 null 이 아니다.
privateName 을 ResolvePrivateIdentifier (privateEnv ,
privateIdentifier )로 한다.
PrivateElementFind (rVal ,
privateName )이 empty 가 아니면 true 를
반환한다.
false 를 반환한다.
13.10.2 InstanceofOperator ( V , target )
추상 연산 InstanceofOperator는 V (ECMAScript 언어 값 )와
target (ECMAScript 언어 값 )을 인수로 받고,
Boolean이 담긴 정상 완료 또는
throw completion 를 반환한다.
이 연산은 target 의 %Symbol.hasInstance% 메서드를 참조하거나, 없을 경우
target 의 "prototype" 프로퍼티 값이 V 의 프로토타입 체인에 존재하는지를 확인하여
V 가 target 의 인스턴스인지 판별한다. 호출 시 다음 단계를 수행한다:
target 이 객체가 아니면 , TypeError 예외를
throw한다.
instOfHandler 를 ? GetMethod (target , %Symbol.hasInstance% )로 한다.
instOfHandler 가 undefined 가 아니면,
ToBoolean (? Call (instOfHandler ,
target , « V »))를 반환한다.
IsCallable (target )이
false 이면 TypeError 예외를 throw한다.
? OrdinaryHasInstance (target ,
V )를 반환한다.
참고
단계 4 와 5 는 %Symbol.hasInstance% 메서드를 사용하지 않는
이전 ECMAScript 판과의 호환성을 제공한다. 객체가 %Symbol.hasInstance% 를 정의하거나 상속하지
않은 경우
기본 instanceof 의미론을 사용한다.
13.11 동등 연산자
참고
동등 연산자를 평가한 결과는 항상 Boolean 타입이며, 연산자가 지칭하는 관계가 두 피연산자 사이에 성립하는지 여부를 나타낸다.
구문
EqualityExpression [In, Yield,
Await] :
RelationalExpression [?In,
?Yield, ?Await]
EqualityExpression [?In,
?Yield, ?Await]
==
RelationalExpression [?In,
?Yield, ?Await]
EqualityExpression [?In,
?Yield, ?Await]
!=
RelationalExpression [?In,
?Yield, ?Await]
EqualityExpression [?In,
?Yield, ?Await]
===
RelationalExpression [?In,
?Yield, ?Await]
EqualityExpression [?In,
?Yield, ?Await]
!==
RelationalExpression [?In,
?Yield, ?Await]
13.11.1 런타임 의미론: 평가
EqualityExpression
:
EqualityExpression
==
RelationalExpression
lRef 를 ? Evaluation of EqualityExpression 의
결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
rVal 를 ? GetValue (rRef )로 한다.
? IsLooselyEqual (rVal ,
lVal )을 반환한다.
EqualityExpression
:
EqualityExpression
!=
RelationalExpression
lRef 를 ? Evaluation of EqualityExpression 의
결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
rVal 를 ? GetValue (rRef )로 한다.
r 를 ? IsLooselyEqual (rVal ,
lVal )로 한다.
r 가 true 이면 false 를, 아니면
true 를 반환한다.
EqualityExpression
:
EqualityExpression
===
RelationalExpression
lRef 를 ? Evaluation of EqualityExpression 의
결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
rVal 를 ? GetValue (rRef )로 한다.
IsStrictlyEqual (rVal ,
lVal )을 반환한다.
EqualityExpression
:
EqualityExpression
!==
RelationalExpression
lRef 를 ? Evaluation of EqualityExpression 의
결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
rVal 를 ? GetValue (rRef )로 한다.
r 를 IsStrictlyEqual (rVal ,
lVal )로 한다.
r 가 true 이면 false 를, 아니면
true 를 반환한다.
참고 1
위의 동등 연산 정의에 따르면:
문자열 비교를 강제하려면: `${a}` == `${b}`를 사용한다.
숫자 비교를 강제하려면: +a == +b를 사용한다.
불리언 비교를 강제하려면: !a == !b를 사용한다.
참고 2
동등 연산자는 다음 불변식을 유지한다:
A != B는 !(A == B)와 동치이다.
A == B는 B == A와 동치이나, A와 B의 평가
순서는 다를 수 있다.
참고 3
동등 연산자는 항상 추이적이지 않다. 예를 들어 동일한 문자열 값을 갖는 두 개의 서로 다른 String 객체가 있을 수 있다. 각 String 객체는
== 연산자에 의해 그 문자열 값과 동등하게 평가되지만, 두 String 객체끼리는 동등하지 않다. 예시:
new String("a") == "a" 및 "a" == new String("a")는 모두
true 이다.
new String("a") == new String("a")는 false 이다.
참고 4
문자열의 비교는 코드 유닛 값 시퀀스에 대한 단순 동등성 테스트를 사용한다. 유니코드 명세에 정의된 문자 또는 문자열 동등성 및 정렬 순서의 더 복잡한 의미론적
정의를 사용하지 않는다. 따라서 유니코드 표준에 따라 정규화된 문자열 값이라도 서로 다르다고 평가될 수 있다. 사실상 이 알고리즘은 두 문자열이 이미 정규화된
형태임을 전제로 한다.
13.12 이진 비트 연산자
구문
BitwiseANDExpression [In,
Yield, Await] :
EqualityExpression [?In,
?Yield, ?Await]
BitwiseANDExpression [?In,
?Yield, ?Await]
&
EqualityExpression [?In,
?Yield, ?Await]
BitwiseXORExpression [In,
Yield, Await] :
BitwiseANDExpression [?In,
?Yield, ?Await]
BitwiseXORExpression [?In,
?Yield, ?Await]
^
BitwiseANDExpression [?In,
?Yield, ?Await]
BitwiseORExpression [In,
Yield, Await] :
BitwiseXORExpression [?In,
?Yield, ?Await]
BitwiseORExpression [?In,
?Yield, ?Await]
|
BitwiseXORExpression [?In,
?Yield, ?Await]
13.12.1 런타임 의미론: 평가
BitwiseANDExpression
:
BitwiseANDExpression
&
EqualityExpression
? EvaluateStringOrNumericBinaryExpression (BitwiseANDExpression ,
&, EqualityExpression )를 반환한다.
BitwiseXORExpression
:
BitwiseXORExpression
^
BitwiseANDExpression
? EvaluateStringOrNumericBinaryExpression (BitwiseXORExpression ,
^, BitwiseANDExpression )를 반환한다.
BitwiseORExpression
:
BitwiseORExpression
|
BitwiseXORExpression
? EvaluateStringOrNumericBinaryExpression (BitwiseORExpression ,
|, BitwiseXORExpression )를 반환한다.
13.13 이진 논리 연산자
구문
LogicalANDExpression [In,
Yield, Await] :
BitwiseORExpression [?In,
?Yield, ?Await]
LogicalANDExpression [?In,
?Yield, ?Await]
&&
BitwiseORExpression [?In,
?Yield, ?Await]
LogicalORExpression [In,
Yield, Await] :
LogicalANDExpression [?In,
?Yield, ?Await]
LogicalORExpression [?In,
?Yield, ?Await]
||
LogicalANDExpression [?In,
?Yield, ?Await]
CoalesceExpression [In, Yield,
Await] :
CoalesceExpressionHead [?In,
?Yield, ?Await]
??
BitwiseORExpression [?In,
?Yield, ?Await]
CoalesceExpressionHead [In,
Yield, Await] :
CoalesceExpression [?In,
?Yield, ?Await]
BitwiseORExpression [?In,
?Yield, ?Await]
ShortCircuitExpression [In,
Yield, Await] :
LogicalORExpression [?In,
?Yield, ?Await]
CoalesceExpression [?In,
?Yield, ?Await]
참고
&& 또는 || 연산자가 생성하는 값은 반드시 Boolean 타입일 필요는 없다. 생성되는 값은 항상 두
피연산자 중 하나의 값이 된다.
13.13.1 런타임 의미론: 평가
LogicalANDExpression
:
LogicalANDExpression
&&
BitwiseORExpression
lRef 를 ? Evaluation of LogicalANDExpression 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
ToBoolean (lVal )이
false 이면 lVal 를 반환한다.
rRef 를 ? Evaluation of BitwiseORExpression 의 결과로 한다.
? GetValue (rRef )를 반환한다.
LogicalORExpression
:
LogicalORExpression
||
LogicalANDExpression
lRef 를 ? Evaluation of LogicalORExpression 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
ToBoolean (lVal )이
true 이면 lVal 를 반환한다.
rRef 를 ? Evaluation of LogicalANDExpression 의 결과로 한다.
? GetValue (rRef )를 반환한다.
CoalesceExpression
:
CoalesceExpressionHead
??
BitwiseORExpression
lRef 를 ? Evaluation of CoalesceExpressionHead 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
lVal 가 undefined 또는 null 이면,
rRef 를 ? Evaluation of
BitwiseORExpression 의 결과로
한다.
? GetValue (rRef )를 반환한다.
그 외에는,
lVal 를 반환한다.
13.14 조건 연산자 (? :)
구문
ConditionalExpression [In,
Yield, Await] :
ShortCircuitExpression [?In,
?Yield, ?Await]
ShortCircuitExpression [?In,
?Yield, ?Await]
?
AssignmentExpression [+In,
?Yield, ?Await]
:
AssignmentExpression [?In,
?Yield, ?Await]
참고
ECMAScript에서 ConditionalExpression 의 문법은 C와 Java와
약간 다릅니다. C와 Java는 두 번째 부분식에 Expression 을 허용하지만, 세 번째 식은 ConditionalExpression 으로 제한합니다.
ECMAScript에서 이 차이를 둔 이유는 조건문의 어느 쪽 분기에도 할당식을 둘 수 있도록 하고, 가운데 식으로 콤마 식이 오는 혼란스럽고 거의 쓸모없는 경우를
없애기 위함입니다.
13.14.1 런타임 의미론: 평가
ConditionalExpression
:
ShortCircuitExpression
?
AssignmentExpression
:
AssignmentExpression
lRef 를 ? Evaluation of ShortCircuitExpression 의 결과로 한다.
lVal 를 ToBoolean (? GetValue (lRef ))로 한다.
lVal 이 true 이면,
trueRef 를 ? Evaluation of
첫 번째 AssignmentExpression 의 결과로
한다.
? GetValue (trueRef )를 반환한다.
그 외에는,
falseRef 를 ? Evaluation of
두 번째 AssignmentExpression 의 결과로
한다.
? GetValue (falseRef )를 반환한다.
13.15 할당 연산자
구문
AssignmentExpression [In,
Yield, Await] :
ConditionalExpression [?In,
?Yield, ?Await]
[+Yield]
YieldExpression [?In,
?Await]
ArrowFunction [?In, ?Yield,
?Await]
AsyncArrowFunction [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
=
AssignmentExpression [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
AssignmentOperator
AssignmentExpression [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
&&=
AssignmentExpression [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
||=
AssignmentExpression [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
??=
AssignmentExpression [?In,
?Yield, ?Await]
AssignmentOperator :
one of *= /= %=
+= -= <<= >>=
>>>= &= ^= |=
**=
13.15.1 정적 의미론: 초기 에러
AssignmentExpression
:
LeftHandSideExpression
=
AssignmentExpression
AssignmentExpression
:
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
AssignmentExpression
:
LeftHandSideExpression
&&=
AssignmentExpression
LeftHandSideExpression
||=
AssignmentExpression
LeftHandSideExpression
??=
AssignmentExpression
13.15.2 런타임 의미론: 평가
AssignmentExpression
:
LeftHandSideExpression
=
AssignmentExpression
LeftHandSideExpression 이 ObjectLiteral 도 아니고
ArrayLiteral 도 아니면,
lRef 를 ? Evaluation of
LeftHandSideExpression 의
결과로 한다.
LeftHandSideExpression 의
AssignmentTargetType 이
web-compat 이면 ReferenceError 예외를
throw한다.
IsAnonymousFunctionDefinition (AssignmentExpression )이
true 이고 IsIdentifierRef
of LeftHandSideExpression 가
true 이면,
lhs 를 StringValue
of LeftHandSideExpression 로
한다.
rVal 를 ? NamedEvaluation of AssignmentExpression
with argument lhs 로 한다.
그 외에는,
rRef 를 ? Evaluation of AssignmentExpression 의
결과로 한다.
rVal 를 ? GetValue (rRef )로
한다.
? PutValue (lRef ,
rVal )를 수행한다.
rVal 를 반환한다.
assignmentPattern 을 AssignmentPattern 으로 하며, 이는 커버(cover) 되어야 하며 LeftHandSideExpression 에 의해
포함된다.
rRef 를 ? Evaluation of AssignmentExpression 의 결과로 한다.
rVal 를 ? GetValue (rRef )로 한다.
? DestructuringAssignmentEvaluation of
assignmentPattern with argument rVal 을 수행한다.
rVal 를 반환한다.
AssignmentExpression
:
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
lRef 를 ? Evaluation of LeftHandSideExpression 의 결과로 한다.
LeftHandSideExpression 의
AssignmentTargetType 이
web-compat 이면 ReferenceError 예외를 throw한다.
lVal 를
? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of AssignmentExpression 의 결과로 한다.
rVal 를 ? GetValue (rRef )로 한다.
assignmentOpText 를 소스 텍스트에서
일치하는 AssignmentOperator 의 값으로 한다.
opText 를 다음 표에서 assignmentOpText 에 해당하는 유니코드 코드 포인트 시퀀스로 한다:
assignmentOpText
opText
**=
**
*=
*
/=
/
%=
%
+=
+
-=
-
<<=
<<
>>=
>>
>>>=
>>>
&=
&
^=
^
|=
|
r 를 ? ApplyStringOrNumericBinaryOperator (lVal ,
opText , rVal )로 한다.
? PutValue (lRef , r )를
수행한다.
r 를 반환한다.
AssignmentExpression
:
LeftHandSideExpression
&&=
AssignmentExpression
lRef 를 ? Evaluation of LeftHandSideExpression 의 결과로 한다.
lVal 를
? GetValue (lRef )로 한다.
ToBoolean (lVal )이
false 이면 lVal 를 반환한다.
IsAnonymousFunctionDefinition (AssignmentExpression )이
true 이고 IsIdentifierRef of
LeftHandSideExpression 가
true 이면,
lhs 를 StringValue of
LeftHandSideExpression 로
한다.
rVal 를 ? NamedEvaluation of AssignmentExpression with
argument lhs 로 한다.
그 외에는,
rRef 를 ? Evaluation of
AssignmentExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
? PutValue (lRef , rVal )를
수행한다.
rVal 를 반환한다.
AssignmentExpression
:
LeftHandSideExpression
||=
AssignmentExpression
lRef 를 ? Evaluation of LeftHandSideExpression 의 결과로 한다.
lVal 를
? GetValue (lRef )로 한다.
ToBoolean (lVal )이
true 이면 lVal 를 반환한다.
IsAnonymousFunctionDefinition (AssignmentExpression )이
true 이고 IsIdentifierRef of
LeftHandSideExpression 가
true 이면,
lhs 를 StringValue of
LeftHandSideExpression 로
한다.
rVal 를 ? NamedEvaluation of AssignmentExpression with
argument lhs 로 한다.
그 외에는,
rRef 를 ? Evaluation of
AssignmentExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
? PutValue (lRef , rVal )를
수행한다.
rVal 를 반환한다.
AssignmentExpression
:
LeftHandSideExpression
??=
AssignmentExpression
lRef 를 ? Evaluation of LeftHandSideExpression 의 결과로 한다.
lVal 를
? GetValue (lRef )로 한다.
lVal 가 undefined 도 아니고 null 도 아니면
lVal 를 반환한다.
IsAnonymousFunctionDefinition (AssignmentExpression )이
true 이고 IsIdentifierRef of
LeftHandSideExpression 가
true 이면,
lhs 를 StringValue of
LeftHandSideExpression 로
한다.
rVal 를 ? NamedEvaluation of AssignmentExpression with
argument lhs 로 한다.
그 외에는,
rRef 를 ? Evaluation of
AssignmentExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
? PutValue (lRef , rVal )를
수행한다.
rVal 를 반환한다.
참고
이 표현식이 strict mode 코드 내에 있을 때, 1.e ,
3 ,
2 ,
2 ,
2
단계의 lRef 가 해결할 수 없는 참조라면 런타임 오류가 발생하며, ReferenceError 예외가
throw된다. 또한 9 ,
6 ,
6 ,
6
단계의 lRef 가 데이터 프로퍼티 로서 { [[Writable]] : false } 속성을 갖거나, 접근자
프로퍼티 로서 { [[Set]] :
undefined } 속성을 갖거나, IsExtensible 가
false 를 반환하는 객체의 존재하지 않는 프로퍼티라면 TypeError 예외가
throw된다.
13.15.3 ApplyStringOrNumericBinaryOperator ( lVal ,
opText , rVal )
추상 연산 ApplyStringOrNumericBinaryOperator는 lVal (ECMAScript 언어 값 ), opText
(**, *, /, %,
+, -, <<, >>,
>>>, &, ^, 또는 |),
rVal (ECMAScript 언어 값 )을 인수로 받으며, String,
BigInt 또는 Number가 담긴 정상 완료 또는
throw completion 를 반환한다.
호출 시 다음 단계를 수행한다:
opText 가 +이면,
lPrim 을 ? ToPrimitive (lVal )로 한다.
rPrim 을 ? ToPrimitive (rVal )로 한다.
lPrim 이 String 이거나
rPrim 이 String 이면,
lStr 을 ? ToString (lPrim )로
한다.
rStr 을 ? ToString (rPrim )로
한다.
lStr 과 rStr 의 문자열
연결(string-concatenation) 결과를 반환한다.
lVal 을 lPrim 으로 설정한다.
rVal 을 rPrim 으로 설정한다.
NOTE: 이 시점에서 반드시 숫자 연산이어야 한다.
lNum 을 ? ToNumeric (lVal )로 한다.
rNum 을 ? ToNumeric (rVal )로 한다.
SameType (lNum , rNum )이
false 이면, TypeError 예외를 throw한다.
lNum 이 BigInt 이면,
opText 가 **이면, ? BigInt::exponentiate (lNum ,
rNum )를 반환한다.
opText 가 /이면, ? BigInt::divide (lNum ,
rNum )를 반환한다.
opText 가 %이면, ? BigInt::remainder (lNum ,
rNum )를 반환한다.
opText 가 >>>이면, ? BigInt::unsignedRightShift (lNum ,
rNum )를 반환한다.
operation 을 아래 표에서 opText 와 연관된 추상 연산으로 한다:
그 외에는,
Assert :
lNum 이 Number 임을
보장한다.
operation 을 아래 표에서 opText 와 연관된 추상 연산으로 한다:
operation (lNum , rNum )을 반환한다.
참고 1
단계 ToPrimitive 의 호출에는 힌트가 제공되지 않는다(1.a , 1.b ). 표준 객체(날짜 객체 제외)는
힌트가 없으면 number 가 주어진 것처럼 동작하며, 날짜 객체는
string 이 주어진 것처럼 동작한다. Exotic 객체 는 힌트가 없을 때 다르게 동작할 수
있다.
참고 2
1.c 단계는 3 단계 및 IsLessThan 알고리즘과 달리 논리합(or)
연산을 사용한다.
13.15.4 EvaluateStringOrNumericBinaryExpression (
leftOperand , opText , rightOperand )
추상 연산 EvaluateStringOrNumericBinaryExpression는 leftOperand (파스 노드(Parse
Node) ), opText (유니코드 코드 포인트의 시퀀스), rightOperand
(파스
노드(Parse Node) )를 인수로 받고, String, BigInt, Number가 담긴 정상 완료(normal completion)
또는 비정상 완료(abrupt
completion) 를 반환한다. 호출 시 다음 단계를 수행한다:
lRef 를 ? Evaluation of
leftOperand 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of
rightOperand 의 결과로 한다.
rVal 를 ? GetValue (rRef )로 한다.
? ApplyStringOrNumericBinaryOperator (lVal ,
opText , rVal )를 반환한다.
13.15.5 구조 분해 할당
보충 구문
다음의 생성식의 인스턴스 처리를 수행할 때
AssignmentExpression
:
LeftHandSideExpression
=
AssignmentExpression
LeftHandSideExpression 의 해석은 다음 문법을 사용하여
정교화된다:
AssignmentPattern [Yield,
Await] :
ObjectAssignmentPattern [?Yield,
?Await]
ArrayAssignmentPattern [?Yield,
?Await]
ObjectAssignmentPattern [Yield,
Await] :
{
}
{
AssignmentRestProperty [?Yield,
?Await]
}
{
AssignmentPropertyList [?Yield,
?Await]
}
{
AssignmentPropertyList [?Yield,
?Await]
,
AssignmentRestProperty [?Yield,
?Await] opt
}
ArrayAssignmentPattern [Yield,
Await] :
[
Elision opt
AssignmentRestElement [?Yield,
?Await] opt
]
[
AssignmentElementList [?Yield,
?Await]
]
[
AssignmentElementList [?Yield,
?Await]
,
Elision opt
AssignmentRestElement [?Yield,
?Await] opt
]
AssignmentRestProperty [Yield,
Await] :
...
DestructuringAssignmentTarget [?Yield,
?Await]
AssignmentPropertyList [Yield,
Await] :
AssignmentProperty [?Yield,
?Await]
AssignmentPropertyList [?Yield,
?Await]
,
AssignmentProperty [?Yield,
?Await]
AssignmentElementList [Yield,
Await] :
AssignmentElisionElement [?Yield,
?Await]
AssignmentElementList [?Yield,
?Await]
,
AssignmentElisionElement [?Yield,
?Await]
AssignmentElisionElement [Yield,
Await] :
Elision opt
AssignmentElement [?Yield,
?Await]
AssignmentProperty [Yield,
Await] :
IdentifierReference [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
PropertyName [?Yield,
?Await]
:
AssignmentElement [?Yield,
?Await]
AssignmentElement [Yield,
Await] :
DestructuringAssignmentTarget [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
AssignmentRestElement [Yield,
Await] :
...
DestructuringAssignmentTarget [?Yield,
?Await]
DestructuringAssignmentTarget [Yield,
Await] :
LeftHandSideExpression [?Yield,
?Await]
13.15.5.1 정적 의미론: 초기 에러
AssignmentProperty
:
IdentifierReference
Initializer opt
AssignmentRestProperty
:
...
DestructuringAssignmentTarget
DestructuringAssignmentTarget
: LeftHandSideExpression
13.15.5.2 런타임 의미론: DestructuringAssignmentEvaluation
구문 지시 연산
DestructuringAssignmentEvaluation은 value (ECMAScript 언어 값 )을 인수로 받아,
정상 완료
unused 또는 비정상
완료 를 반환한다.
아래 생성식에 대해 조각별로 정의된다:
ObjectAssignmentPattern
:
{
}
? RequireObjectCoercible (value )를
수행한다.
unused 를 반환한다.
ObjectAssignmentPattern
:
{
AssignmentPropertyList
}
{
AssignmentPropertyList
,
}
? RequireObjectCoercible (value )를
수행한다.
? PropertyDestructuringAssignmentEvaluation
of AssignmentPropertyList 에
value 인수를 넘겨 수행한다.
unused 를 반환한다.
ObjectAssignmentPattern
:
{
AssignmentRestProperty
}
? RequireObjectCoercible (value )를
수행한다.
excludedNames 를 비어 있는 새 List 로 한다.
? RestDestructuringAssignmentEvaluation
of AssignmentRestProperty 에
value , excludedNames 인수를 넘겨 수행한 결과를 반환한다.
ObjectAssignmentPattern
:
{
AssignmentPropertyList
,
AssignmentRestProperty
}
? RequireObjectCoercible (value )를
수행한다.
excludedNames 를 ? PropertyDestructuringAssignmentEvaluation
of AssignmentPropertyList 에
value 인수를 넘겨 수행한 결과로 한다.
? RestDestructuringAssignmentEvaluation
of AssignmentRestProperty 에
value , excludedNames 인수를 넘겨 수행한 결과를 반환한다.
ArrayAssignmentPattern
:
[
]
iteratorRecord 를 ? GetIterator (value ,
sync )로 한다.
? IteratorClose (iteratorRecord ,
NormalCompletion (unused ))를
반환한다.
ArrayAssignmentPattern
:
[
Elision
]
iteratorRecord 를 ? GetIterator (value ,
sync )로 한다.
result 를 Completion (IteratorDestructuringAssignmentEvaluation
of Elision 에
iteratorRecord 인수를 넘겨 수행한 결과)로 한다.
iteratorRecord .[[Done]] 이
false 이면, ? IteratorClose (iteratorRecord ,
result )를 반환한다.
result 를 반환한다.
ArrayAssignmentPattern
:
[
Elision opt
AssignmentRestElement
]
iteratorRecord 를 ? GetIterator (value ,
sync )로 한다.
Elision 이 존재하면,
status 를 Completion (IteratorDestructuringAssignmentEvaluation
of Elision 에
iteratorRecord 인수를 넘겨 수행한 결과)로 한다.
status 가 비정상
완료 라면,
Assert :
iteratorRecord .[[Done]] 이
true 임을 보장한다.
? status 를 반환한다.
result 를 Completion (IteratorDestructuringAssignmentEvaluation
of AssignmentRestElement 에
iteratorRecord 인수를 넘겨 수행한 결과)로 한다.
iteratorRecord .[[Done]] 이
false 이면, ? IteratorClose (iteratorRecord ,
result )를 반환한다.
result 를 반환한다.
ArrayAssignmentPattern
:
[
AssignmentElementList
]
iteratorRecord 를 ? GetIterator (value ,
sync )로 한다.
result 를 Completion (IteratorDestructuringAssignmentEvaluation
of AssignmentElementList 에
iteratorRecord 인수를 넘겨 수행한 결과)로 한다.
iteratorRecord .[[Done]] 이
false 이면, ? IteratorClose (iteratorRecord ,
result )를 반환한다.
result 를 반환한다.
ArrayAssignmentPattern
:
[
AssignmentElementList
,
Elision opt
AssignmentRestElement opt
]
iteratorRecord 를 ? GetIterator (value ,
sync )로 한다.
status 를 Completion (IteratorDestructuringAssignmentEvaluation
of AssignmentElementList 에
iteratorRecord 인수를 넘겨 수행한 결과)로 한다.
status 가 비정상
완료 라면,
iteratorRecord .[[Done]] 이
false 이면, ? IteratorClose (iteratorRecord ,
status )를 반환한다.
? status 를 반환한다.
Elision 이 존재하면,
status 를 Completion (IteratorDestructuringAssignmentEvaluation
of Elision 에
iteratorRecord 인수를 넘겨 수행한 결과)로 한다.
status 가 비정상
완료 라면,
Assert :
iteratorRecord .[[Done]] 이
true 임을 보장한다.
? status 를 반환한다.
AssignmentRestElement 이 존재하면,
status 를 Completion (IteratorDestructuringAssignmentEvaluation
of AssignmentRestElement
에 iteratorRecord 인수를 넘겨 수행한 결과)로 한다.
iteratorRecord .[[Done]] 이
false 이면, ? IteratorClose (iteratorRecord ,
status )를 반환한다.
? status 를 반환한다.
13.15.5.3 런타임 의미론:
PropertyDestructuringAssignmentEvaluation
구문 지시 연산
PropertyDestructuringAssignmentEvaluation은 value (ECMAScript 언어 값 )을 인수로 받고,
정상 완료(normal
completion) 로 List (모든
구조 분해된 프로퍼티
키 의 리스트) 또는 비정상 완료(abrupt
completion) 를 반환한다. 아래 생성식에 대해 조각별로 정의된다:
AssignmentPropertyList
:
AssignmentPropertyList
,
AssignmentProperty
propertyNames 를 ? PropertyDestructuringAssignmentEvaluation
of AssignmentPropertyList 에
value 인수를 넘겨 수행한 결과로 한다.
nextNames 를 ? PropertyDestructuringAssignmentEvaluation
of AssignmentProperty 에
value 인수를 넘겨 수행한 결과로 한다.
propertyNames 와 nextNames 의 리스트
연결(list-concatenation) 결과를 반환한다.
AssignmentProperty
:
IdentifierReference
Initializer opt
P 를 StringValue of
IdentifierReference 로 한다.
lRef 를 ? ResolveBinding (P )로 한다.
v 를 ? GetV (value , P )로 한다.
Initializer 가 존재하고
v 가 undefined 이면,
IsAnonymousFunctionDefinition (Initializer )이
true 이면,
v 를 ? NamedEvaluation of
Initializer 에
P 인수를 넘겨 수행한 결과로 설정한다.
그 외에는,
defaultValue 를 ? Evaluation of Initializer 결과로 한다.
v 를 ? GetValue (defaultValue )로
한다.
? PutValue (lRef , v )를
수행한다.
« P »를 반환한다.
AssignmentProperty
:
PropertyName
:
AssignmentElement
name 을 ? Evaluation of
PropertyName 로 한다.
? KeyedDestructuringAssignmentEvaluation of
AssignmentElement 에
value , name 인수를 넘겨 수행한다.
« name »를 반환한다.
13.15.5.4 런타임 의미론:
RestDestructuringAssignmentEvaluation
구문 지시 연산
RestDestructuringAssignmentEvaluation은 value (ECMAScript 언어 값 )과
excludedNames (List 타입의
프로퍼티 키
리스트)를 인수로 받고, 정상 완료(normal
completion) unused 또는 비정상 완료(abrupt
completion) 를 반환한다. 아래 생성식에 대해 조각별로 정의된다:
AssignmentRestProperty
:
...
DestructuringAssignmentTarget
lRef 를 ? Evaluation of
DestructuringAssignmentTarget 의
결과로 한다.
restObj 를 OrdinaryObjectCreate (%Object.prototype% )로
한다.
? CopyDataProperties (restObj ,
value , excludedNames )를 수행한다.
? PutValue (lRef ,
restObj )를 반환한다.
13.15.5.5 런타임 의미론:
IteratorDestructuringAssignmentEvaluation
구문 지시 연산
IteratorDestructuringAssignmentEvaluation은 iteratorRecord (이터레이터
레코드 )를 인수로 받고, 정상 완료(normal
completion) unused 또는 비정상 완료(abrupt
completion) 를 반환한다.
아래 생성식에 대해 조각별로 정의된다:
AssignmentElementList
: AssignmentElisionElement
? IteratorDestructuringAssignmentEvaluation
of AssignmentElisionElement 에
iteratorRecord 인수를 넘겨 수행한 결과를 반환한다.
AssignmentElementList
:
AssignmentElementList
,
AssignmentElisionElement
? IteratorDestructuringAssignmentEvaluation
of AssignmentElementList 에
iteratorRecord 인수를 넘겨 수행한다.
? IteratorDestructuringAssignmentEvaluation
of AssignmentElisionElement 에
iteratorRecord 인수를 넘겨 수행한 결과를 반환한다.
AssignmentElisionElement
: AssignmentElement
? IteratorDestructuringAssignmentEvaluation
of AssignmentElement 에
iteratorRecord 인수를 넘겨 수행한 결과를 반환한다.
AssignmentElisionElement
:
Elision
AssignmentElement
? IteratorDestructuringAssignmentEvaluation
of Elision 에
iteratorRecord 인수를 넘겨 수행한다.
? IteratorDestructuringAssignmentEvaluation
of AssignmentElement 에
iteratorRecord 인수를 넘겨 수행한 결과를 반환한다.
Elision : ,
iteratorRecord .[[Done]] 이
false 이면,
? IteratorStep (iteratorRecord )를
수행한다.
unused 를 반환한다.
Elision :
Elision
,
? IteratorDestructuringAssignmentEvaluation
of Elision 에
iteratorRecord 인수를 넘겨 수행한다.
iteratorRecord .[[Done]] 이
false 이면,
? IteratorStep (iteratorRecord )를
수행한다.
unused 를 반환한다.
AssignmentElement
:
DestructuringAssignmentTarget
Initializer opt
DestructuringAssignmentTarget 이
ObjectLiteral 도
아니고 ArrayLiteral 도
아니면,
lRef 를 ? Evaluation
of DestructuringAssignmentTarget 의
결과로 한다.
value 를 undefined 로 한다.
iteratorRecord .[[Done]] 이
false 이면,
next 를 ? IteratorStepValue (iteratorRecord )로
한다.
next 가 done 이 아니면,
value 를 next 로 설정한다.
Initializer 가 존재하고
value 가 undefined 이면,
IsAnonymousFunctionDefinition (Initializer )이
true 이고 IsIdentifierRef
of DestructuringAssignmentTarget 가
true 이면,
target 을 StringValue
of DestructuringAssignmentTarget 로
한다.
v 를 ? NamedEvaluation of
Initializer 에
target 인수를 넘겨 수행한 결과로 설정한다.
그 외에는,
defaultValue 를 ? Evaluation of Initializer 결과로 한다.
v 를 ? GetValue (defaultValue )로
설정한다.
그 외에는,
v 를 value 로 한다.
DestructuringAssignmentTarget 이
ObjectLiteral 또는
ArrayLiteral 인 경우,
nestedAssignmentPattern 을 AssignmentPattern 으로 한다.
이는 커버(cover) 되어야 하며 DestructuringAssignmentTarget 에
의해 포함된다.
? DestructuringAssignmentEvaluation
of nestedAssignmentPattern 에 v 인수를 넘겨 수행한 결과를 반환한다.
? PutValue (lRef , v )를
반환한다.
참고
왼쪽에서 오른쪽으로의 평가 순서는 구조 분해 패턴이 아닌 DestructuringAssignmentTarget 을
이터레이터에 접근하거나 Initializer 를 평가하기 전에 평가함으로써 유지된다.
AssignmentRestElement
:
...
DestructuringAssignmentTarget
DestructuringAssignmentTarget 이
ObjectLiteral 도
아니고 ArrayLiteral 도
아니면,
lRef 를 ? Evaluation
of DestructuringAssignmentTarget 의
결과로 한다.
A 를 ! ArrayCreate (0)으로 한다.
n 을 0으로 한다.
iteratorRecord .[[Done]] 이
false 인 동안 반복한다,
next 를 ? IteratorStepValue (iteratorRecord )로
한다.
next 가 done 이 아니면,
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (n )),
next )를 수행한다.
n 을 n + 1로 설정한다.
DestructuringAssignmentTarget 이
ObjectLiteral 도
아니고 ArrayLiteral 도
아니면,
? PutValue (lRef ,
A )를 반환한다.
nestedAssignmentPattern 을 AssignmentPattern 으로 하고, 이는
커버(cover) 되어야 하며 DestructuringAssignmentTarget 에
의해 포함된다.
? DestructuringAssignmentEvaluation of
nestedAssignmentPattern 에 A 인수를 넘겨 수행한 결과를 반환한다.
13.15.5.6 런타임 의미론:
KeyedDestructuringAssignmentEvaluation
구문 지시 연산
KeyedDestructuringAssignmentEvaluation은 value (ECMAScript 언어 값 )과
propertyName (프로퍼티 키 )를 인수로 받고, 정상 완료(normal
completion) unused 또는 비정상 완료(abrupt
completion) 를 반환한다.
아래 생성식에 대해 조각별로 정의된다:
AssignmentElement
:
DestructuringAssignmentTarget
Initializer opt
DestructuringAssignmentTarget 이
ObjectLiteral 도
아니고 ArrayLiteral 도
아니면,
lRef 를 ? Evaluation
of DestructuringAssignmentTarget 의
결과로 한다.
v 를 ? GetV (value ,
propertyName )로 한다.
Initializer 가 존재하고
v 가 undefined 이면,
IsAnonymousFunctionDefinition (Initializer )이
true 이고 IsIdentifierRef
of DestructuringAssignmentTarget 가
true 이면,
target 을 StringValue
of DestructuringAssignmentTarget 로
한다.
rhsValue 를 ? NamedEvaluation of
Initializer 에
target 인수를 넘겨 수행한 결과로 한다.
그 외에는,
defaultValue 를 ? Evaluation of Initializer 결과로 한다.
rhsValue 를 ? GetValue (defaultValue )로
한다.
그 외에는,
rhsValue 를 v 로 한다.
DestructuringAssignmentTarget 이
ObjectLiteral 또는
ArrayLiteral 인 경우,
assignmentPattern 을 AssignmentPattern 으로 한다.
이는 커버(cover) 되어야 하며 DestructuringAssignmentTarget 에
의해 포함된다.
? DestructuringAssignmentEvaluation
of assignmentPattern 에 rhsValue 인수를 넘겨 수행한 결과를 반환한다.
? PutValue (lRef ,
rhsValue )를 반환한다.
13.16 콤마 연산자 ( , )
구문
Expression [In, Yield,
Await] :
AssignmentExpression [?In,
?Yield, ?Await]
Expression [?In, ?Yield,
?Await]
,
AssignmentExpression [?In,
?Yield, ?Await]
13.16.1 런타임 의미론: 평가
Expression :
Expression
,
AssignmentExpression
lRef 를 ? Evaluation of Expression 의 결과로 한다.
? GetValue (lRef )를 수행한다.
rRef 를 ? Evaluation of AssignmentExpression 의 결과로 한다.
? GetValue (rRef )를 반환한다.
참고
GetValue
는 값이 사용되지 않더라도 관측 가능한 부수 효과가 있을 수 있으므로 반드시 호출되어야 한다.
14 ECMAScript 언어: 문과 선언
구문
Statement [Yield, Await,
Return] :
BlockStatement [?Yield, ?Await,
?Return]
VariableStatement [?Yield,
?Await]
EmptyStatement
ExpressionStatement [?Yield,
?Await]
IfStatement [?Yield, ?Await,
?Return]
BreakableStatement [?Yield,
?Await, ?Return]
ContinueStatement [?Yield,
?Await]
BreakStatement [?Yield,
?Await]
[+Return]
ReturnStatement [?Yield,
?Await]
WithStatement [?Yield, ?Await,
?Return]
LabelledStatement [?Yield,
?Await, ?Return]
ThrowStatement [?Yield,
?Await]
TryStatement [?Yield, ?Await,
?Return]
DebuggerStatement
Declaration [Yield,
Await] :
HoistableDeclaration [?Yield,
?Await, ~Default]
ClassDeclaration [?Yield, ?Await,
~Default]
LexicalDeclaration [+In,
?Yield, ?Await]
HoistableDeclaration [Yield,
Await, Default] :
FunctionDeclaration [?Yield,
?Await, ?Default]
GeneratorDeclaration [?Yield,
?Await, ?Default]
AsyncFunctionDeclaration [?Yield,
?Await, ?Default]
AsyncGeneratorDeclaration [?Yield,
?Await, ?Default]
BreakableStatement [Yield, Await,
Return] :
IterationStatement [?Yield,
?Await, ?Return]
SwitchStatement [?Yield, ?Await,
?Return]
14.1 문 의미론
14.1.1 런타임 의미론: 평가
HoistableDeclaration
:
GeneratorDeclaration
AsyncFunctionDeclaration
AsyncGeneratorDeclaration
empty 를 반환한다.
HoistableDeclaration
: FunctionDeclaration
? Evaluation of FunctionDeclaration 의 결과를 반환한다.
BreakableStatement
:
IterationStatement
SwitchStatement
newLabelSet 을 비어 있는 새 List 로 한다.
? LabelledEvaluation of this BreakableStatement
에 newLabelSet 인수를 넘겨 수행한 결과를 반환한다.
14.2 블록
구문
BlockStatement [Yield, Await,
Return] :
Block [?Yield, ?Await,
?Return]
Block [Yield, Await,
Return] :
{
StatementList [?Yield, ?Await,
?Return] opt
}
StatementList [Yield, Await,
Return] :
StatementListItem [?Yield,
?Await, ?Return]
StatementList [?Yield, ?Await,
?Return]
StatementListItem [?Yield,
?Await, ?Return]
StatementListItem [Yield, Await,
Return] :
Statement [?Yield, ?Await,
?Return]
Declaration [?Yield,
?Await]
14.2.1 정적 의미론: 초기 에러
Block :
{
StatementList
}
14.2.2 런타임 의미론: 평가
Block :
{
}
empty 를 반환한다.
Block :
{
StatementList
}
oldEnv 를 실행 중인 실행 컨텍스트(running execution
context) 의 LexicalEnvironment로 한다.
blockEnv 를 NewDeclarativeEnvironment (oldEnv )로
한다.
BlockDeclarationInstantiation (StatementList ,
blockEnv )를 수행한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 blockEnv 로 설정한다.
blockValue 를 Completion (Evaluation of StatementList )의 결과로 한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 oldEnv 로 설정한다.
? blockValue 를 반환한다.
참고 1
어떤 방식으로 Block 에서 벗어나더라도
LexicalEnvironment는 항상 이전 상태로 복원된다.
StatementList :
StatementList
StatementListItem
sl 을 ? Evaluation of StatementList 의 결과로 한다.
s 를 Completion (Evaluation of StatementListItem )의 결과로 한다.
? UpdateEmpty (s , sl )를
반환한다.
참고 2
StatementList 의 값은
StatementList 내 마지막 값
생성 항목의 값이다. 예를 들어, 다음 eval 함수 호출은 모두 1을 반환한다:
eval ("1;;;;;" )
eval ("1;{}" )
eval ("1;var a;" )
14.2.3 BlockDeclarationInstantiation ( code ,
env )
추상 연산 BlockDeclarationInstantiation은 code (파스 노드(Parse
Node) )와 env (선언적 환경 레코드(Declarative Environment
Record) )를 인수로 받고 unused 를 반환한다. code 는
블록의 본문에 해당하는 파스 노드(Parse Node) 이다. env 는 바인딩이
생성될 환경 레코드(Environment Record) 이다.
참고
Block 또는 CaseBlock 이 평가될 때, 새로운
선언적 환경 레코드 가 생성되고, 블록
내 선언된 각 블록 범위 변수, 상수, 함수, 클래스에 대한 바인딩이 환경 레코드 에 인스턴스화된다.
호출 시 다음 단계를 수행한다:
declarations 를 LexicallyScopedDeclarations
of code 로 한다.
privateEnv 를 실행 중인 실행 컨텍스트(running execution
context) 의 PrivateEnvironment로 한다.
declarations 의 각 요소 d 에 대해, 다음을 수행한다:
BoundNames of
d 의 각 요소 dn 에 대해, 다음을 수행한다:
IsConstantDeclaration
of d 가 true 이면,
! env .CreateImmutableBinding(dn ,
true )을 수행한다.
그 외에는,
! env .CreateMutableBinding(dn ,
false )을 수행한다. 참고: 이 단계는 B.3.2.6
절에서 대체된다.
d 가 FunctionDeclaration ,
GeneratorDeclaration ,
AsyncFunctionDeclaration ,
AsyncGeneratorDeclaration
중 하나라면, 다음을 수행한다:
fn 을 BoundNames
of d 의 유일한 요소로 한다.
fo 를 InstantiateFunctionObject
of d 에 env 와 privateEnv 인수를 넘겨 수행한 결과로
한다.
! env .InitializeBinding(fn , fo )를
수행한다. 참고: 이 단계는 B.3.2.6
절에서 대체된다.
unused 를 반환한다.
14.3 선언과 변수 문
14.3.1 let 및 const 선언
참고
let 및 const 선언은 실행 중인 실행 컨텍스트(running execution
context) 의 LexicalEnvironment에 스코프를 갖는 변수를 정의한다. 이 변수들은 해당
환경 레코드(Environment Record) 가
인스턴스화될 때 생성되지만, 변수의 LexicalBinding 이 평가되기 전까지는 어떠한 방식으로든 접근할
수 없다. LexicalBinding 이 Initializer 를 포함하는 경우, 해당
변수는 Initializer 의
AssignmentExpression 이 LexicalBinding 이 평가될 때 값을
할당받으며, 변수 생성 시 할당받지 않는다. let 선언 내의 LexicalBinding 에 Initializer 가 없는 경우, 해당 변수는
LexicalBinding 이 평가될
때 undefined 가 할당된다.
구문
LexicalDeclaration [In,
Yield, Await] :
LetOrConst
BindingList [?In, ?Yield,
?Await]
;
LetOrConst :
let
const
BindingList [In, Yield,
Await] :
LexicalBinding [?In,
?Yield, ?Await]
BindingList [?In, ?Yield,
?Await]
,
LexicalBinding [?In,
?Yield, ?Await]
LexicalBinding [In, Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
Initializer [?In, ?Yield,
?Await] opt
BindingPattern [?Yield,
?Await]
Initializer [?In, ?Yield,
?Await]
14.3.1.1 정적 의미론: 초기 에러
LexicalDeclaration
:
LetOrConst
BindingList
;
LexicalBinding :
BindingIdentifier
Initializer opt
14.3.1.2 런타임 의미론: 평가
LexicalDeclaration
:
LetOrConst
BindingList
;
? Evaluation of BindingList 를 수행한다.
empty 를 반환한다.
BindingList :
BindingList
,
LexicalBinding
? Evaluation of BindingList 를 수행한다.
? Evaluation of LexicalBinding 을 반환한다.
LexicalBinding :
BindingIdentifier
lhs 를 ! ResolveBinding (StringValue of
BindingIdentifier )로 한다.
! InitializeReferencedBinding (lhs ,
undefined )를 수행한다.
empty 를 반환한다.
참고
정적 의미론 규칙에 의해 이 형태의 LexicalBinding 이
const 선언에 등장하는 일은 없다.
LexicalBinding :
BindingIdentifier
Initializer
bindingId 를 StringValue of
BindingIdentifier 로 한다.
lhs 를 ! ResolveBinding (bindingId )로
한다.
IsAnonymousFunctionDefinition (Initializer )이
true 이면,
value 를 ? NamedEvaluation of Initializer
에 bindingId 인수를 넘겨 수행한 결과로 한다.
그 외에는,
rhs 를 ? Evaluation
of Initializer 의 결과로 한다.
value 를 ? GetValue (rhs )로 한다.
! InitializeReferencedBinding (lhs ,
value )를 수행한다.
empty 를 반환한다.
LexicalBinding :
BindingPattern
Initializer
rhs 를 ? Evaluation of
Initializer 의 결과로
한다.
value 를 ? GetValue (rhs )로 한다.
env 를 실행 중인 실행 컨텍스트(running execution
context) 의 LexicalEnvironment로 한다.
? BindingInitialization of BindingPattern 에
value 와 env 를 인수로 넘겨 수행한 결과를 반환한다.
14.3.2 변수 문
참고
var 문은 실행 중인 실행 컨텍스트(running execution
context) 의 VariableEnvironment에 스코프를 갖는 변수를 선언한다. var 변수는 해당
환경 레코드(Environment Record) 가
인스턴스화될 때 생성되고, 생성 시 undefined 로 초기화된다. 어떤 VariableEnvironment의 스코프
내에서는 동일한 BindingIdentifier 가 둘 이상의 VariableDeclaration 에 나타날 수 있으나, 이
선언들은 모여 하나의 변수만 정의한다. VariableDeclaration 이 Initializer 를 포함하는 경우, 해당
변수는 Initializer 의
AssignmentExpression 이 VariableDeclaration 이 실행될 때 값을
할당받으며, 변수 생성 시 할당받지 않는다.
구문
VariableStatement [Yield,
Await] :
var
VariableDeclarationList [+In,
?Yield, ?Await]
;
VariableDeclarationList [In,
Yield, Await] :
VariableDeclaration [?In,
?Yield, ?Await]
VariableDeclarationList [?In,
?Yield, ?Await]
,
VariableDeclaration [?In,
?Yield, ?Await]
VariableDeclaration [In,
Yield, Await] :
BindingIdentifier [?Yield,
?Await]
Initializer [?In, ?Yield,
?Await] opt
BindingPattern [?Yield,
?Await]
Initializer [?In, ?Yield,
?Await]
14.3.2.1 런타임 의미론: 평가
VariableStatement
:
var
VariableDeclarationList
;
? Evaluation of VariableDeclarationList 를
수행한다.
empty 를 반환한다.
VariableDeclarationList
:
VariableDeclarationList
,
VariableDeclaration
? Evaluation of VariableDeclarationList 를
수행한다.
? Evaluation of VariableDeclaration 을 반환한다.
VariableDeclaration
: BindingIdentifier
empty 를 반환한다.
VariableDeclaration
:
BindingIdentifier
Initializer
bindingId 를 StringValue of
BindingIdentifier 로 한다.
lhs 를 ? ResolveBinding (bindingId )로 한다.
IsAnonymousFunctionDefinition (Initializer )가
true 이면,
value 를 ? NamedEvaluation of Initializer
에 bindingId 인수를 넘겨 수행한 결과로 한다.
그 외에는,
rhs 를 ? Evaluation
of Initializer 의 결과로 한다.
value 를 ? GetValue (rhs )로 한다.
? PutValue (lhs ,
value )를 수행한다.
empty 를 반환한다.
참고
VariableDeclaration 이 with 문
내부에 중첩되어 있고 해당 BindingIdentifier 가 with 문의 바인딩
객체의 프로퍼티
이름(property name) 과 같으면, 5 단계는
VariableEnvironment 바인딩 대신 프로퍼티에 value 를 할당한다.
VariableDeclaration
:
BindingPattern
Initializer
rhs 를 ? Evaluation of
Initializer 의 결과로
한다.
rVal 을 ? GetValue (rhs )로 한다.
? BindingInitialization of BindingPattern 에
rVal 및 undefined 를 인수로 넘겨 수행한 결과를 반환한다.
14.3.3 구조 분해 바인딩 패턴
구문
BindingPattern [Yield,
Await] :
ObjectBindingPattern [?Yield,
?Await]
ArrayBindingPattern [?Yield,
?Await]
ObjectBindingPattern [Yield,
Await] :
{
}
{
BindingRestProperty [?Yield,
?Await]
}
{
BindingPropertyList [?Yield,
?Await]
}
{
BindingPropertyList [?Yield,
?Await]
,
BindingRestProperty [?Yield,
?Await] opt
}
ArrayBindingPattern [Yield,
Await] :
[
Elision opt
BindingRestElement [?Yield,
?Await] opt
]
[
BindingElementList [?Yield,
?Await]
]
[
BindingElementList [?Yield,
?Await]
,
Elision opt
BindingRestElement [?Yield,
?Await] opt
]
BindingRestProperty [Yield,
Await] :
...
BindingIdentifier [?Yield,
?Await]
BindingPropertyList [Yield,
Await] :
BindingProperty [?Yield,
?Await]
BindingPropertyList [?Yield,
?Await]
,
BindingProperty [?Yield,
?Await]
BindingElementList [Yield,
Await] :
BindingElisionElement [?Yield,
?Await]
BindingElementList [?Yield,
?Await]
,
BindingElisionElement [?Yield,
?Await]
BindingElisionElement [Yield,
Await] :
Elision opt
BindingElement [?Yield,
?Await]
BindingProperty [Yield,
Await] :
SingleNameBinding [?Yield,
?Await]
PropertyName [?Yield,
?Await]
:
BindingElement [?Yield,
?Await]
BindingElement [Yield,
Await] :
SingleNameBinding [?Yield,
?Await]
BindingPattern [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
SingleNameBinding [Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
BindingRestElement [Yield,
Await] :
...
BindingIdentifier [?Yield,
?Await]
...
BindingPattern [?Yield,
?Await]
14.3.3.1 런타임 의미론: PropertyBindingInitialization
구문 지시 연산
PropertyBindingInitialization은 value (ECMAScript 언어 값 )과
environment (환경 레코드(Environment Record) 또는
undefined )를 인수로 받고, 정상 완료(normal
completion) 로 List (모든
바인딩된 프로퍼티 키의 리스트) 또는 비정상 완료(abrupt
completion) 를 반환한다. 모든 바인딩된 프로퍼티 이름의 리스트를 수집한다. 다음 생성식에 대해 조각별로 정의된다:
BindingPropertyList
:
BindingPropertyList
,
BindingProperty
boundNames 를 ? PropertyBindingInitialization of BindingPropertyList 에
value 와 environment 를 인수로 넘겨 수행한 결과로 한다.
nextNames 를 ? PropertyBindingInitialization of BindingProperty
에 value 와 environment 를 인수로 넘겨 수행한 결과로 한다.
boundNames 와 nextNames 의 리스트
연결(list-concatenation) 결과를 반환한다.
BindingProperty
: SingleNameBinding
name 을 BoundNames of SingleNameBinding 의 유일한 요소로 한다.
? KeyedBindingInitialization of SingleNameBinding
에 value , environment , name 을 인수로 넘겨 수행한다.
« name »를 반환한다.
BindingProperty
:
PropertyName
:
BindingElement
P 를 ? Evaluation of
PropertyName 의 결과로
한다.
? KeyedBindingInitialization of BindingElement 에
value , environment , P 를 인수로 넘겨 수행한다.
« P »를 반환한다.
14.3.3.2 런타임 의미론: RestBindingInitialization
구문 지시 연산
RestBindingInitialization은 value
(ECMAScript 언어 값 ),
environment (환경 레코드(Environment Record) 또는
undefined ), excludedNames (List 타입의 프로퍼티 키 리스트)를
인수로 받고, 정상 완료(normal
completion) unused 또는 비정상 완료(abrupt
completion) 를 반환한다.
다음 생성식에 대해 조각별로 정의된다:
BindingRestProperty
:
...
BindingIdentifier
lhs 를 ? ResolveBinding (StringValue of
BindingIdentifier ,
environment )로 한다.
restObj 를 OrdinaryObjectCreate (%Object.prototype% )로
한다.
? CopyDataProperties (restObj ,
value , excludedNames )를 수행한다.
environment 가 undefined 이면, ? PutValue (lhs ,
restObj )를 반환한다.
? InitializeReferencedBinding (lhs ,
restObj )를 반환한다.
14.3.3.3 런타임 의미론: KeyedBindingInitialization
구문 지시 연산
KeyedBindingInitialization은 value
(ECMAScript 언어 값 ),
environment (환경 레코드(Environment Record) 또는
undefined ), propertyName (프로퍼티 키 )를 인수로 받고, 정상 완료(normal
completion) unused 또는 비정상 완료(abrupt
completion) 를 반환한다.
참고
environment 에 undefined 가 전달되는 경우, 초기화 값을 할당하기 위해
PutValue 연산을 사용해야 함을 나타낸다. 이는 비엄격
함수(non-strict functions) 의 형식적 매개변수 리스트의 경우이다. 이런 경우, 동일한 이름의
여러 매개변수가 있을 수 있으므로 형식적 매개변수 바인딩이 미리 초기화된다.
다음 생성식에 대해 조각별로 정의된다:
BindingElement :
BindingPattern
Initializer opt
v 를 ? GetV (value ,
propertyName )로 한다.
Initializer 가 존재하고
v 가 undefined 이면,
defaultValue 를 ? Evaluation of Initializer 의
결과로 한다.
v 를 ? GetValue (defaultValue )로
설정한다.
? BindingInitialization of BindingPattern 에
v 와 environment 를 인수로 넘겨 수행한 결과를 반환한다.
SingleNameBinding
:
BindingIdentifier
Initializer opt
bindingId 를 StringValue of
BindingIdentifier 로 한다.
lhs 를 ? ResolveBinding (bindingId ,
environment )로 한다.
v 를 ? GetV (value ,
propertyName )로 한다.
Initializer 가 존재하고
v 가 undefined 이면,
IsAnonymousFunctionDefinition (Initializer )가
true 이면,
v 를 ? NamedEvaluation of
Initializer 에
bindingId 인수를 넘겨 수행한 결과로 설정한다.
그 외에는,
defaultValue 를 ? Evaluation of Initializer 의 결과로 한다.
v 를 ? GetValue (defaultValue )로
설정한다.
environment 가 undefined 이면, ? PutValue (lhs , v )를
반환한다.
? InitializeReferencedBinding (lhs ,
v )를 반환한다.
14.4 빈 문
구문
EmptyStatement :
;
14.4.1 런타임 의미론: 평가
EmptyStatement :
;
empty 를 반환한다.
14.5 표현식 문
구문
ExpressionStatement [Yield,
Await] :
[lookahead ∉ { { , function , async
[no LineTerminator here]
function , class , let
[ }]
Expression [+In, ?Yield,
?Await]
;
참고
ExpressionStatement 는
U+007B(LEFT CURLY BRACKET)로 시작할 수 없다. 왜냐하면 이는 Block 과 혼동될 수 있기 때문이다. ExpressionStatement 는
function 또는 class 키워드 로 시작할 수 없는데, 이는 FunctionDeclaration ,
GeneratorDeclaration ,
또는 ClassDeclaration 과
혼동될 수 있기 때문이다.
ExpressionStatement 는
async function으로 시작할 수 없는데, 이는 AsyncFunctionDeclaration 또는
AsyncGeneratorDeclaration 과 혼동될 수
있기 때문이다.
ExpressionStatement 는
let [의 두 토큰 시퀀스로 시작할 수 없는데, 이는 LexicalDeclaration 의 첫 LexicalBinding 이 ArrayBindingPattern 인
let 선언과 혼동될 수 있기 때문이다.
14.5.1 런타임 의미론: 평가
ExpressionStatement
:
Expression
;
exprRef 를 ? Evaluation of Expression 의 결과로 한다.
? GetValue (exprRef )를 반환한다.
14.6 if 문
구문
IfStatement [Yield, Await,
Return] :
if
(
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
else
Statement [?Yield, ?Await,
?Return]
if
(
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
[lookahead ≠ else ]
참고
lookahead 제한 [lookahead ≠ else]는 고전적인 "dangling else" 문제를
일반적인 방식으로 해결한다. 즉, 연관된 if의 선택이 모호할 경우, else는 후보 if들 중 가장
가까운(가장 안쪽의) 것과 연관된다.
14.6.1 정적 의미론: 초기 에러
IfStatement :
if
(
Expression
)
Statement
else
Statement
IfStatement :
if
(
Expression
)
Statement
참고
이 규칙은 B.3.1 에 명시된 확장이 구현된
경우에만 적용해야 한다.
14.6.2 런타임 의미론: 평가
IfStatement :
if
(
Expression
)
Statement
else
Statement
exprRef 를 ? Evaluation of Expression 의 결과로 한다.
exprValue 를 ToBoolean (? GetValue (exprRef ))의 결과로 한다.
exprValue 가 true 이면,
stmtCompletion 을 Completion (Evaluation of 첫 번째 Statement )의 결과로 한다.
그 외에는,
stmtCompletion 을 Completion (Evaluation of 두 번째 Statement )의 결과로 한다.
? UpdateEmpty (stmtCompletion ,
undefined )를 반환한다.
IfStatement :
if
(
Expression
)
Statement
exprRef 를 ? Evaluation of Expression 의 결과로 한다.
exprValue 를 ToBoolean (? GetValue (exprRef ))의 결과로 한다.
exprValue 가 false 이면,
undefined 를 반환한다.
그 외에는,
stmtCompletion 을 Completion (Evaluation of Statement )의 결과로 한다.
? UpdateEmpty (stmtCompletion ,
undefined )를 반환한다.
14.7 반복문
구문
IterationStatement [Yield,
Await, Return] :
DoWhileStatement [?Yield,
?Await, ?Return]
WhileStatement [?Yield, ?Await,
?Return]
ForStatement [?Yield, ?Await,
?Return]
ForInOfStatement [?Yield,
?Await, ?Return]
14.7.1 의미론
14.7.1.1 LoopContinues ( completion ,
labelSet )
추상 연산 LoopContinues는 completion (Completion Record )
와 labelSet (문자열 리스트(List of
Strings) )를 인수로 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
completion 이 normal
completion 이면 true 를 반환한다.
completion 이 continue
completion 이 아니면 false 를 반환한다.
completion .[[Target]] 이
empty 이면 true 를 반환한다.
labelSet 이 completion .[[Target]] 을 포함하면
true 를 반환한다.
false 를 반환한다.
참고
14.7.1.2 런타임 의미론: LoopEvaluation
구문 지시 연산
LoopEvaluation은 labelSet (문자열 리스트(List of
Strings) )를 인수로 받고, 정상 완료(normal
completion) 로 ECMAScript 언어 값
또는 비정상 완료(abrupt
completion) 를 반환한다.
다음 생성식에 대해 조각별로 정의된다:
IterationStatement
: DoWhileStatement
? DoWhileLoopEvaluation of DoWhileStatement
에 labelSet 인수를 넘겨 수행한 결과를 반환한다.
IterationStatement
: WhileStatement
? WhileLoopEvaluation of WhileStatement 에
labelSet 인수를 넘겨 수행한 결과를 반환한다.
IterationStatement
: ForStatement
? ForLoopEvaluation of ForStatement 에
labelSet 인수를 넘겨 수행한 결과를 반환한다.
IterationStatement
: ForInOfStatement
? ForInOfLoopEvaluation of ForInOfStatement
에 labelSet 인수를 넘겨 수행한 결과를 반환한다.
14.7.2 do-while 문
구문
DoWhileStatement [Yield,
Await, Return] :
do
Statement [?Yield, ?Await,
?Return]
while
(
Expression [+In, ?Yield,
?Await]
)
;
14.7.2.1 정적 의미론: 초기 에러
DoWhileStatement
:
do
Statement
while
(
Expression
)
;
참고
이 규칙은 B.3.1 에 명시된 확장이 구현된
경우에만 적용된다.
14.7.2.2 런타임 의미론: DoWhileLoopEvaluation
구문 지시 연산
DoWhileLoopEvaluation은 labelSet (문자열 리스트(List of
Strings) )를 인수로 받고, 정상 완료(normal
completion) 로 ECMAScript 언어 값
또는 비정상 완료(abrupt
completion) 를 반환한다.
다음 생성식에 대해 조각별로 정의된다:
DoWhileStatement
:
do
Statement
while
(
Expression
)
;
V 를 undefined 로 한다.
반복한다,
stmtResult 를 Completion (Evaluation of Statement )의 결과로
한다.
LoopContinues (stmtResult ,
labelSet )가 false 이면, ? UpdateEmpty (stmtResult ,
V )를 반환한다.
stmtResult .[[Value]] 가
empty 가 아니면, V 에 stmtResult .[[Value]] 를 설정한다.
exprRef 를 ? Evaluation
of Expression 의 결과로 한다.
exprValue 를 ? GetValue (exprRef )의 결과로
한다.
ToBoolean (exprValue )
가 false 이면 V 를 반환한다.
14.7.3 while 문
구문
WhileStatement [Yield, Await,
Return] :
while
(
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
14.7.3.1 정적 의미론: 초기 에러
WhileStatement :
while
(
Expression
)
Statement
참고
이 규칙은 B.3.1 에 명시된 확장이 구현된
경우에만 적용한다.
14.7.3.2 런타임 의미론: WhileLoopEvaluation
구문 지시 연산
WhileLoopEvaluation은 labelSet (문자열 리스트(List of
Strings) )를 인수로 받고, 정상 완료(normal
completion) 로 ECMAScript 언어 값
또는 비정상 완료(abrupt
completion) 를 반환한다.
다음 생성식에 대해 조각별로 정의된다:
WhileStatement :
while
(
Expression
)
Statement
V 를 undefined 로 한다.
반복한다,
exprRef 를 ? Evaluation
of Expression 의 결과로 한다.
exprValue 를 ? GetValue (exprRef )의 결과로
한다.
ToBoolean (exprValue )
가 false 이면 V 를 반환한다.
stmtResult 를 Completion (Evaluation of Statement )의 결과로
한다.
LoopContinues (stmtResult ,
labelSet )가 false 이면, ? UpdateEmpty (stmtResult ,
V )를 반환한다.
stmtResult .[[Value]] 가
empty 가 아니면, V 에 stmtResult .[[Value]] 를 설정한다.
14.7.4 for 문
구문
ForStatement [Yield, Await,
Return] :
for
(
[lookahead ≠ let
[ ]
Expression [~In, ?Yield,
?Await] opt
;
Expression [+In, ?Yield,
?Await] opt
;
Expression [+In, ?Yield,
?Await] opt
)
Statement [?Yield, ?Await,
?Return]
for
(
var
VariableDeclarationList [~In,
?Yield, ?Await]
;
Expression [+In, ?Yield,
?Await] opt
;
Expression [+In, ?Yield,
?Await] opt
)
Statement [?Yield, ?Await,
?Return]
for
(
LexicalDeclaration [~In,
?Yield, ?Await]
Expression [+In, ?Yield,
?Await] opt
;
Expression [+In, ?Yield,
?Await] opt
)
Statement [?Yield, ?Await,
?Return]
14.7.4.1 정적 의미론: 초기 에러
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
참고
이 규칙은 B.3.1 에 명시된 확장이 구현된
경우에만 적용된다.
ForStatement :
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
14.7.4.2 런타임 의미론: ForLoopEvaluation
구문 지시 연산
ForLoopEvaluation은 labelSet (문자열 리스트(List of
Strings) )를 인수로 받고, 정상 완료(normal
completion) 로 ECMAScript 언어 값
또는 비정상 완료(abrupt
completion) 를 반환한다.
다음 생성식에 대해 조각별로 정의된다:
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
첫 번째 Expression 이
존재하면,
exprRef 를 ? Evaluation
of 첫 번째 Expression 의 결과로 한다.
? GetValue (exprRef )를
수행한다.
두 번째 Expression 이
존재하면 test 를 두 번째 Expression 로, 아니면 test 를
empty 로 한다.
세 번째 Expression 이
존재하면 increment 를 세 번째 Expression 로, 아니면 increment 를
empty 로 한다.
? ForBodyEvaluation (test ,
increment , Statement , « »,
labelSet )을 반환한다.
ForStatement :
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
? Evaluation of VariableDeclarationList 를
수행한다.
첫 번째 Expression 이
존재하면 test 를 첫 번째 Expression 로, 아니면 test 를
empty 로 한다.
두 번째 Expression 이
존재하면 increment 를 두 번째 Expression 로, 아니면 increment 를
empty 로 한다.
? ForBodyEvaluation (test ,
increment , Statement , « »,
labelSet )을 반환한다.
ForStatement :
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
oldEnv 를 실행 중인 실행 컨텍스트(running execution
context) 의 LexicalEnvironment로 한다.
loopEnv 를 NewDeclarativeEnvironment (oldEnv )로
한다.
isConst 를 IsConstantDeclaration
of LexicalDeclaration 의 결과로 한다.
boundNames 를 BoundNames of LexicalDeclaration 의 결과로 한다.
boundNames 의 각 요소 dn 에 대해, 다음을 수행한다:
isConst 가 true 이면,
! loopEnv .CreateImmutableBinding(dn ,
true )을 수행한다.
그 외에는,
! loopEnv .CreateMutableBinding(dn ,
false )을 수행한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 loopEnv 로 설정한다.
forDcl 을 Completion (Evaluation of LexicalDeclaration )의 결과로 한다.
forDcl 이 비정상 완료(abrupt
completion) 이면,
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 oldEnv 로 설정한다.
? forDcl 을 반환한다.
isConst 가 false 이면 perIterationLets 를
boundNames 로, 아니면 perIterationLets 를 비어 있는 List 로 한다.
첫 번째 Expression 이
존재하면 test 를 첫 번째 Expression 로, 아니면 test 를
empty 로 한다.
두 번째 Expression 이
존재하면 increment 를 두 번째 Expression 로, 아니면 increment 를
empty 로 한다.
bodyResult 를 Completion (ForBodyEvaluation (test ,
increment , Statement , perIterationLets ,
labelSet ))의 결과로 한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 oldEnv 로 설정한다.
? bodyResult 를 반환한다.
14.7.4.3 ForBodyEvaluation ( test ,
increment , stmt , perIterationBindings , labelSet
)
추상 연산 ForBodyEvaluation은 test (Expression 파스
노드(Parse Node) 또는 empty ), increment
(Expression 파스
노드(Parse Node) 또는 empty ), stmt
(Statement 파스
노드(Parse Node) ), perIterationBindings (문자열 리스트(List of
Strings) ), labelSet (문자열 리스트(List of
Strings) )를 인수로 받고, 정상 완료(normal
completion) 로 ECMAScript 언어 값
또는 비정상 완료(abrupt
completion) 를 반환한다. 호출 시 다음 단계를 수행한다:
V 를 undefined 로 한다.
? CreatePerIterationEnvironment (perIterationBindings )를
수행한다.
반복한다,
test 가 empty 가 아니면,
testRef 를 ? Evaluation of
test 의 결과로 한다.
testValue 를 ? GetValue (testRef )의
결과로 한다.
ToBoolean (testValue )
가 false 이면 V 를 반환한다.
result 를 Completion (Evaluation of stmt )의
결과로 한다.
LoopContinues (result ,
labelSet )가 false 이면, ? UpdateEmpty (result ,
V )를 반환한다.
result .[[Value]] 가
empty 가 아니면, V 에 result .[[Value]] 를 설정한다.
? CreatePerIterationEnvironment (perIterationBindings )를
수행한다.
increment 가 empty 가 아니면,
incRef 를 ? Evaluation of
increment 의 결과로 한다.
? GetValue (incRef )를
수행한다.
14.7.4.4 CreatePerIterationEnvironment (
perIterationBindings )
추상 연산 CreatePerIterationEnvironment는 perIterationBindings (문자열 리스트(List of
Strings) )를 인수로 받고, 정상 완료(normal
completion) unused 또는 throw completion 를
반환한다. 호출 시 다음 단계를 수행한다:
perIterationBindings 에 요소가 하나라도 있으면,
lastIterationEnv 를 실행 중인 실행
컨텍스트(running execution context) 의 LexicalEnvironment로
한다.
outer 를 lastIterationEnv .[[OuterEnv]] 로 한다.
Assert : outer 는
null 이 아니다.
thisIterationEnv 를 NewDeclarativeEnvironment (outer )로
한다.
perIterationBindings 의 각 요소 bn 에 대해, 다음을 수행한다:
! thisIterationEnv .CreateMutableBinding(bn ,
false )를 수행한다.
lastValue 를
? lastIterationEnv .GetBindingValue(bn ,
true )로 한다.
! thisIterationEnv .InitializeBinding(bn ,
lastValue )를 수행한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를
thisIterationEnv 로 설정한다.
unused 를 반환한다.
14.7.5 for-in,
for-of, 그리고 for-await-of
문
구문
ForInOfStatement [Yield,
Await, Return] :
for
(
[lookahead ≠ let
[ ]
LeftHandSideExpression [?Yield,
?Await]
in
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
var
ForBinding [?Yield,
?Await]
in
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
ForDeclaration [?Yield,
?Await]
in
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
[lookahead ∉ { let , async
of }]
LeftHandSideExpression [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
var
ForBinding [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
ForDeclaration [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
[+Await]
for
await
(
[lookahead ≠ let ]
LeftHandSideExpression [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
[+Await]
for
await
(
var
ForBinding [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
[+Await]
for
await
(
ForDeclaration [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
ForDeclaration [Yield,
Await] :
LetOrConst
ForBinding [?Yield,
?Await]
ForBinding [Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
BindingPattern [?Yield,
?Await]
참고
14.7.5.1 정적 의미론: 초기 에러
ForInOfStatement
:
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
var
ForBinding
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
참고
이 규칙은 B.3.1 에 명시된 확장이 구현된
경우에만 적용된다.
ForInOfStatement
:
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
ForInOfStatement
:
for
(
ForDeclaration
in
Expression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
14.7.5.2 정적 의미론: IsDestructuring
구문 지시 연산
IsDestructuring은 인수를 받지 않으며 Boolean을 반환한다.
다음 생성식에 대해 조각별로 정의된다:
MemberExpression
: PrimaryExpression
PrimaryExpression 이 ObjectLiteral 또는
ArrayLiteral 인 경우,
true 를 반환한다.
false 를 반환한다.
MemberExpression
:
MemberExpression
[
Expression
]
MemberExpression
.
IdentifierName
MemberExpression
TemplateLiteral
SuperProperty
MetaProperty
new
MemberExpression
Arguments
MemberExpression
.
PrivateIdentifier
NewExpression :
new
NewExpression
LeftHandSideExpression
:
CallExpression
OptionalExpression
false 를 반환한다.
ForDeclaration :
LetOrConst
ForBinding
IsDestructuring
of ForBinding 의 결과를
반환한다.
ForBinding : BindingIdentifier
false 를 반환한다.
ForBinding : BindingPattern
true 를 반환한다.
참고
14.7.5.3 런타임 의미론: ForDeclarationBindingInitialization
구문 지시 연산
ForDeclarationBindingInitialization은 value (ECMAScript 언어 값 )과
environment (환경 레코드(Environment Record) 또는
undefined )를 인수로 받고, 정상 완료(normal
completion) unused 또는 비정상 완료(abrupt
completion) 를 반환한다.
참고
environment 에 undefined 가 전달되면, 초기화 값을 할당하기 위해 PutValue
연산을 사용해야 함을 나타낸다. 이는 var 문과 일부 비엄격 함수(non-strict
functions) 의 형식적 매개변수 리스트의 경우이다( 10.2.11 참조). 이러한
경우, 렉시컬 바인딩이 호이스팅되고 초기화자 평가 전에 미리 초기화된다.
다음 생성식에 대해 조각별로 정의된다:
ForDeclaration :
LetOrConst
ForBinding
? BindingInitialization of ForBinding 에
value 와 environment 를 인수로 넘겨 수행한 결과를 반환한다.
14.7.5.4 런타임 의미론: ForDeclarationBindingInstantiation
구문 지시 연산
ForDeclarationBindingInstantiation은 environment (선언적 환경 레코드(Declarative Environment
Record) )를 인수로 받고 unused 를 반환한다. 다음 생성식에 대해 조각별로
정의된다:
ForDeclaration :
LetOrConst
ForBinding
ForBinding 의
BoundNames 의 각 요소
name 에 대해, 다음을 수행한다:
IsConstantDeclaration
of LetOrConst 이
true 이면,
! environment .CreateImmutableBinding(name ,
true )를 수행한다.
그 외에는,
! environment .CreateMutableBinding(name ,
false )를 수행한다.
unused 를 반환한다.
14.7.5.5 런타임 의미론: ForInOfLoopEvaluation
구문 지시 연산
ForInOfLoopEvaluation은 labelSet (문자열 리스트(List of
Strings) )를 인수로 받고, 정상 완료(normal
completion) 로 ECMAScript 언어 값
또는 비정상 완료(abrupt
completion) 를 반환한다.
다음 생성식에 대해 조각별로 정의된다:
ForInOfStatement
:
for
(
LeftHandSideExpression
in
Expression
)
Statement
keyResult 를 ? ForIn/OfHeadEvaluation (« », Expression ,
enumerate )의 결과로 한다.
? ForIn/OfBodyEvaluation (LeftHandSideExpression ,
Statement ,
keyResult , enumerate ,
assignment , labelSet )을 반환한다.
ForInOfStatement
:
for
(
var
ForBinding
in
Expression
)
Statement
keyResult 를 ? ForIn/OfHeadEvaluation (« », Expression ,
enumerate )의 결과로 한다.
? ForIn/OfBodyEvaluation (ForBinding , Statement ,
keyResult , enumerate ,
var-binding , labelSet )을 반환한다.
ForInOfStatement
:
for
(
ForDeclaration
in
Expression
)
Statement
keyResult 를 ? ForIn/OfHeadEvaluation (BoundNames of ForDeclaration ,
Expression ,
enumerate )의 결과로 한다.
? ForIn/OfBodyEvaluation (ForDeclaration ,
Statement ,
keyResult , enumerate ,
lexical-binding , labelSet )을 반환한다.
ForInOfStatement
:
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
keyResult 를 ? ForIn/OfHeadEvaluation (« », AssignmentExpression ,
iterate )의 결과로 한다.
? ForIn/OfBodyEvaluation (LeftHandSideExpression ,
Statement ,
keyResult , iterate ,
assignment , labelSet )을 반환한다.
ForInOfStatement
:
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
keyResult 를 ? ForIn/OfHeadEvaluation (« », AssignmentExpression ,
iterate )의 결과로 한다.
? ForIn/OfBodyEvaluation (ForBinding , Statement ,
keyResult , iterate ,
var-binding , labelSet )을 반환한다.
ForInOfStatement
:
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
keyResult 를 ? ForIn/OfHeadEvaluation (BoundNames of ForDeclaration ,
AssignmentExpression ,
iterate )의 결과로 한다.
? ForIn/OfBodyEvaluation (ForDeclaration ,
Statement ,
keyResult , iterate ,
lexical-binding , labelSet )을 반환한다.
ForInOfStatement
:
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
keyResult 를 ? ForIn/OfHeadEvaluation (« », AssignmentExpression ,
async-iterate )의 결과로 한다.
? ForIn/OfBodyEvaluation (LeftHandSideExpression ,
Statement ,
keyResult , iterate ,
assignment , labelSet ,
async )을 반환한다.
ForInOfStatement
:
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
keyResult 를 ? ForIn/OfHeadEvaluation (« », AssignmentExpression ,
async-iterate )의 결과로 한다.
? ForIn/OfBodyEvaluation (ForBinding , Statement ,
keyResult , iterate ,
var-binding , labelSet ,
async )을 반환한다.
ForInOfStatement
:
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
keyResult 를 ? ForIn/OfHeadEvaluation (BoundNames of ForDeclaration ,
AssignmentExpression ,
async-iterate )의 결과로 한다.
? ForIn/OfBodyEvaluation (ForDeclaration ,
Statement ,
keyResult , iterate ,
lexical-binding , labelSet ,
async )을 반환한다.
참고
14.7.5.6 ForIn/OfHeadEvaluation (
uninitializedBoundNames , expr , iterationKind )
추상 연산 ForIn/OfHeadEvaluation은 uninitializedBoundNames (문자열의 리스트(List) ),
expr (Expression
파스
노드(Parse Node) 또는 AssignmentExpression 파스
노드(Parse Node) ), iterationKind
(enumerate , iterate , 또는
async-iterate )를 인수로 받고, 정상 완료(normal
completion) 로 이터레이터 레코드(Iterator Record) 또는
비정상 완료(abrupt
completion) 를 반환한다. 호출 시 다음 단계를 수행한다:
oldEnv 를 실행 중인 실행 컨텍스트(running execution
context) 의 LexicalEnvironment로 한다.
uninitializedBoundNames 가 비어 있지 않으면,
Assert :
uninitializedBoundNames 에 중복 항목이 없어야 한다.
newEnv 를 NewDeclarativeEnvironment (oldEnv )로
한다.
uninitializedBoundNames 의 각 문자열 name 에 대해,
! newEnv .CreateMutableBinding(name ,
false )을 수행한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 newEnv 로 설정한다.
exprRef 를 Completion (Evaluation of expr )의 결과로 한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 oldEnv 로 설정한다.
exprValue 를 ? GetValue (?
exprRef )의 결과로 한다.
iterationKind 가 enumerate 이면,
exprValue 가 undefined 또는
null 이면,
Completion
Record { [[Type]] :
break , [[Value]] :
empty , [[Target]] :
empty }를 반환한다.
obj 를 ! ToObject (exprValue )로
한다.
iterator 를 EnumerateObjectProperties (obj )의
결과로 한다.
nextMethod 를 ! GetV (iterator ,
"next" )의 결과로 한다.
이터레이터 레코드(Iterator
Record) { [[Iterator]] :
iterator , [[NextMethod]] :
nextMethod , [[Done]] :
false }를 반환한다.
그 외에는,
Assert : iterationKind 는
iterate 또는
async-iterate 이어야 한다.
iterationKind 가 async-iterate 이면
iteratorKind 를 async 로 한다.
그 외에는 iteratorKind 를 sync 로 한다.
Return ? GetIterator (exprValue ,
iteratorKind ).
14.7.5.7 ForIn/OfBodyEvaluation ( lhs ,
stmt , iteratorRecord , iterationKind , lhsKind ,
labelSet [ , iteratorKind ] )
추상 연산 ForIn/OfBodyEvaluation은 lhs (파스 노드(Parse Node) ),
stmt (Statement
파스
노드(Parse Node) ), iteratorRecord (이터레이터
레코드(Iterator Record) ), iterationKind
(enumerate
또는 iterate ), lhsKind (assignment ,
var-binding , 또는 lexical-binding ),
labelSet (문자열의 리스트(List) ), 그리고 선택적 인수
iteratorKind (sync 또는
async )를 인수로 받고, 정상 완료(normal
completion) 로 ECMAScript 언어 값
또는 비정상 완료(abrupt
completion) 를 반환한다. 호출 시 다음 단계를 수행한다:
iteratorKind 가 주어지지 않았다면, iteratorKind 를
sync 로 설정한다.
oldEnv 를 실행 중인 실행 컨텍스트(running execution
context) 의 LexicalEnvironment로 한다.
V 를 undefined 로 한다.
destructuring 를 IsDestructuring
of lhs 의 결과로 한다.
destructuring 이 true 이고 lhsKind 가
assignment 이면,
Assert : lhs 는 LeftHandSideExpression 이어야
한다.
assignmentPattern 을 lhs 가 cover 하는 AssignmentPattern 으로 한다.
반복한다,
nextResult 를 ? Call (iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] )의 결과로 한다.
iteratorKind 가 async 이면,
nextResult 를 ? Await (nextResult )의 결과로
설정한다.
nextResult 가 객체가 아니면 ,
TypeError 예외를 발생시킨다.
done 을 ? IteratorComplete (nextResult )의
결과로 한다.
done 이 true 이면 V 를 반환한다.
nextValue 를 ? IteratorValue (nextResult )의
결과로 한다.
lhsKind 가 assignment 또는
var-binding 이면,
destructuring 이 true 이면,
lhsKind 가 assignment 이면,
status 를 Completion (DestructuringAssignmentEvaluation
of assignmentPattern 에
nextValue 인수를 넘겨 수행한 결과)로 한다.
그 외에는,
Assert :
lhsKind 는
var-binding 이어야 한다.
Assert :
lhs 는 ForBinding 이어야
한다.
status 를 Completion (BindingInitialization
of lhs 에 nextValue 와
undefined 를 인수로 넘겨 수행한 결과)로 한다.
그 외에는,
lhsRef 를 Completion (Evaluation of
lhs )의 결과로 한다. (이것은 반복적으로 평가될 수 있다.)
lhsKind 가 assignment 이고
AssignmentTargetType
of lhs 가 web-compat 이면,
ReferenceError 예외를 발생시킨다.
lhsRef 가 비정상
완료 이면,
status 를 lhsRef 로 한다.
그 외에는,
status 를 Completion (PutValue (lhsRef .[[Value]] ,
nextValue ))의 결과로 한다.
그 외에는,
Assert : lhsKind 는
lexical-binding 이어야 한다.
Assert : lhs 는
ForDeclaration 이어야
한다.
iterationEnv 를 NewDeclarativeEnvironment (oldEnv )로
한다.
ForDeclarationBindingInstantiation
of lhs 에 iterationEnv 인수를 넘겨 수행한다.
실행 중인 실행
컨텍스트 의 LexicalEnvironment를
iterationEnv 로 설정한다.
destructuring 이 true 이면,
status 를 Completion (ForDeclarationBindingInitialization
of lhs 에 nextValue 와
iterationEnv 를 인수로 넘겨 수행한 결과)로 한다.
그 외에는,
Assert :
lhs 는 단일 이름을 바인딩한다.
lhsName 을 BoundNames
of lhs 의 유일한 요소로 한다.
lhsRef 를 ! ResolveBinding (lhsName )로
한다.
status 를 Completion (InitializeReferencedBinding (lhsRef ,
nextValue ))의 결과로 한다.
status 가 비정상
완료 이면,
실행 중인 실행
컨텍스트 의 LexicalEnvironment를
oldEnv 로 설정한다.
iteratorKind 가 async 이면,
? AsyncIteratorClose (iteratorRecord ,
status )를 반환한다.
iterationKind 가 enumerate 이면,
? status 를 반환한다.
그 외에는,
Assert :
iterationKind 는 iterate 이어야
한다.
? IteratorClose (iteratorRecord ,
status )를 반환한다.
result 를 Completion (Evaluation of stmt )의
결과로 한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 oldEnv 로 설정한다.
LoopContinues (result ,
labelSet )이 false 이면,
iterationKind 가 enumerate 이면,
? UpdateEmpty (result ,
V )를 반환한다.
그 외에는,
Assert :
iterationKind 는 iterate 이어야
한다.
status 를 Completion (UpdateEmpty (result ,
V ))의 결과로 한다.
iteratorKind 가 async 이면,
? AsyncIteratorClose (iteratorRecord ,
status )를 반환한다.
? IteratorClose (iteratorRecord ,
status )를 반환한다.
result .[[Value]] 가
empty 가 아니면, V 에 result .[[Value]] 를 설정한다.
14.7.5.8 런타임 의미론: 평가
BindingIdentifier
:
Identifier
yield
await
bindingId 를 BindingIdentifier 의 StringValue 로 한다.
? ResolveBinding (bindingId )를
반환한다.
14.7.5.9 EnumerateObjectProperties ( O )
추상 연산 EnumerateObjectProperties는 인수 O (객체)를 받고, 이터레이터
객체(iterator object) 를 반환한다. 호출 시 다음 단계를 수행한다:
이터레이터 객체 를 반환한다. 이 객체의
next 메서드는 O 의 열거 가능한 프로퍼티의 모든 문자열 키를 순회한다. 이터레이터 객체 는 ECMAScript 코드에서 직접
접근할 수 없다. 프로퍼티 열거의 메커니즘과 순서는 명시되어 있지 않지만, 아래 명시된 규칙을 따라야 한다.
이터레이터 의 throw 및
return 메서드는 null 이며, 호출되지 않는다. 이터레이터 의 next 메서드는 객체의
프로퍼티가 프로퍼티
키 로 반환되어야 하는지 판별한다. 반환되는 프로퍼티 키 에는 심볼(Symbol) 키가 포함되지 않는다.
대상 객체의 프로퍼티는 열거 도중 삭제될 수 있다. 이터레이터 의 next 메서드가 처리하기 전에
삭제된 프로퍼티는 무시된다. 열거 도중 새 프로퍼티가 추가된 경우, 새로 추가된 프로퍼티가 반드시 열거될 필요는 없다. 프로퍼티 이름 은 어떤
열거에서도 이터레이터 의 next 메서드에서 최대 한 번만
반환된다.
대상 객체의 프로퍼티를 열거할 때, 프로토타입, 프로토타입의 프로토타입 등도 재귀적으로 열거 대상에 포함된다. 단, 프로토타입의 프로퍼티가 이터레이터 의 next 메서드에 의해 이미
처리된 이름과 같은 경우는 건너뛴다. 프로토타입 객체의 [[Enumerable]] 속성 값은 이미 처리된 프로퍼티 판정에
고려되지 않는다. 프로토타입 객체의 열거 가능한 프로퍼티 이름은 EnumerateObjectProperties를 해당 프로토타입 객체에 대해 호출하여 얻어야 한다.
EnumerateObjectProperties는 대상 객체의 [[OwnPropertyKeys]] 내부 메서드를 호출하여
자신의 프로퍼티
키 를 얻어야 한다. 프로퍼티 속성 정보는 [[GetOwnProperty]] 내부
메서드를 호출하여 얻어야 한다.
또한 O 나 그 프로토타입 체인의 어떤 객체도 프록시 이색 객체(Proxy exotic object) , TypedArray ,
모듈 네임스페이스 이색 객체(module namespace exotic
object) , 또는 구현체가 제공하는 이색 객체(exotic object) 가 아닌 경우,
이터레이터 는 이터레이터 와 동일하게 동작해야 하며, 이는 CreateForInIterator (O )가
반환하는 이터레이터와 동일하다. 단, 다음 조건 중 하나가 발생할 때까지이다:
O 나 그 프로토타입 체인의 객체의 [[Prototype]] 내부 슬롯의 값이 변경됨
O 나 그 프로토타입 체인의 객체에서 프로퍼티가 제거됨
O 의 프로토타입 체인의 객체에 프로퍼티가 추가됨
O 나 그 프로토타입 체인의 객체의 프로퍼티의 [[Enumerable]] 속성 값이 변경됨
참고 1
ECMAScript 구현체는 14.7.5.10.2.1 의
알고리즘을 직접 구현할 필요는 없다. 위 단락의 제약조건이 위반되지 않는 한, 어떤 동작도 이 알고리즘과 다르지 않으면 된다.
아래는 이러한 규칙을 준수하는 ECMAScript generator 함수의 정보적 정의이다:
function * EnumerateObjectProperties (obj) {
const visited = new Set ();
for (const key of Reflect .ownKeys (obj)) {
if (typeof key === "symbol" ) continue ;
const desc = Reflect .getOwnPropertyDescriptor (obj, key);
if (desc) {
visited.add (key);
if (desc.enumerable ) yield key;
}
}
const proto = Reflect .getPrototypeOf (obj);
if (proto === null ) return ;
for (const protoKey of EnumerateObjectProperties (proto)) {
if (!visited.has (protoKey)) yield protoKey;
}
}
참고 2
이색 객체(exotic
objects) 의 목록은, 구현체들이 전통적으로 이러한 경우에 대해 동작이 달랐고, 다른 경우에는 일치한다는 점에
근거하여 결정되었다. 이 경우에는
CreateForInIterator 와의 일치가 요구되지
않는다.
14.7.5.10 for-in 이터레이터 객체
for-in
이터레이터 는 특정 객체에 대한 특정 반복(iteration)을 나타내는 객체이다. for-in 이터레이터 객체는 ECMAScript 코드에서 직접
접근할 수 없으며, EnumerateObjectProperties 의
동작을 설명하기 위한 목적으로만 존재한다.
14.7.5.10.1 CreateForInIterator ( object )
추상 연산 CreateForInIterator는 인수 object (객체)를 받고, for-in 이터레이터 를 반환한다. 이 연산은
object 의 자신의 및 상속받은 열거 가능한 문자열 프로퍼티를 특정 순서로 순회하는 for-in 이터레이터 객체 를 생성한다. 호출 시
다음 단계를 수행한다:
iterator 를 OrdinaryObjectCreate (%ForInIteratorPrototype% ,
« [[Object]] , [[ObjectWasVisited]] , [[VisitedKeys]] , [[RemainingKeys]] »)로 한다.
iterator .[[Object]] 에
object 를 설정한다.
iterator .[[ObjectWasVisited]] 에
false 를 설정한다.
iterator .[[VisitedKeys]] 에 새로운 빈 리스트(List) 를
설정한다.
iterator .[[RemainingKeys]] 에 새로운 빈 리스트(List) 를
설정한다.
iterator 를 반환한다.
14.7.5.10.2 %ForInIteratorPrototype% 객체
%ForInIteratorPrototype% 객체:
14.7.5.10.2.1 %ForInIteratorPrototype%.next ( )
O 를 this 값으로 한다.
Assert : O 는 객체 이다.
Assert : O 는 for-in 이터레이터
인스턴스의 모든 내부 슬롯을 가진다 (14.7.5.10.3 ).
object 를 O .[[Object]] 로 한다.
반복한다,
O .[[ObjectWasVisited]] 가
false 이면,
keys 를 ? object .[[OwnPropertyKeys]] () 로
한다.
keys 의 각 요소 key 에 대해,
key 가 문자열(String) 이면,
key 를 O .[[RemainingKeys]] 에
추가한다.
O .[[ObjectWasVisited]] 에
true 를 설정한다.
O .[[RemainingKeys]] 가 비어있지 않은 동안
반복한다,
r 을 O .[[RemainingKeys]] 의 첫 번째 요소로 한다.
O .[[RemainingKeys]] 의 첫
번째 요소를 제거한다.
O .[[VisitedKeys]] 에
r 이 없다면,
desc 를 ? object .[[GetOwnProperty]] (r )로
한다.
desc 가
undefined 가 아니면,
r 을 O .[[VisitedKeys]] 에
추가한다.
desc .[[Enumerable]] 가
true 이면, CreateIteratorResultObject (r ,
false )를 반환한다.
object 를 ? object .[[GetPrototypeOf]] () 로 한다.
O .[[Object]] 에
object 를 설정한다.
O .[[ObjectWasVisited]] 에
false 를 설정한다.
object 가 null 이면, CreateIteratorResultObject (undefined ,
true )를 반환한다.
14.7.5.10.3 for-in 이터레이터 인스턴스의 프로퍼티
for-in 이터레이터 인스턴스는 일반 객체(ordinary
objects) 이며, %ForInIteratorPrototype%
내재 객체를 상속한다. for-in 이터레이터 인스턴스는 표 38 에 나열된 내부 슬롯으로
생성된다.
표 38: for-in 이터레이터
인스턴스의 내부 슬롯
내부 슬롯
타입
설명
[[Object]]
객체
반복 대상이 되는 객체 값.
[[ObjectWasVisited]]
불리언(Boolean)
true 이면 이터레이터 가 [[Object]] 에서 [[OwnPropertyKeys]] 를 호출한 적이 있고, 그렇지 않으면
false 이다.
[[VisitedKeys]]
문자열의 리스트(List)
현재까지 이 이터레이터 에서 반환한
값들.
[[RemainingKeys]]
문자열의 리스트(List)
현재 객체에서 프로토타입의 프로퍼티(프로토타입이 null 이 아닌 경우)로 넘어가기 전에
반환해야 할 값들.
14.8 continue 문
구문
ContinueStatement [Yield,
Await] :
continue
;
continue
[여기에 LineTerminator 가 없음]
LabelIdentifier [?Yield,
?Await]
;
14.8.1 정적 의미론: 초기 에러
ContinueStatement
:
continue
;
continue
LabelIdentifier
;
14.8.2 런타임 의미론: 평가
ContinueStatement
:
continue
;
Completion
Record { [[Type]] :
continue , [[Value]] :
empty , [[Target]] :
empty }를 반환한다.
ContinueStatement
:
continue
LabelIdentifier
;
label 을 LabelIdentifier 의 StringValue 로 한다.
Completion
Record { [[Type]] :
continue , [[Value]] :
empty , [[Target]] :
label }를 반환한다.
14.9 break 문
구문
BreakStatement [Yield,
Await] :
break
;
break
[여기에 LineTerminator 가 없음]
LabelIdentifier [?Yield,
?Await]
;
14.9.1 정적 의미론: 초기 에러
BreakStatement :
break
;
14.9.2 런타임 의미론: 평가
BreakStatement :
break
;
Completion
Record { [[Type]] :
break , [[Value]] :
empty , [[Target]] :
empty }를 반환한다.
BreakStatement :
break
LabelIdentifier
;
label 을 LabelIdentifier 의 StringValue 로 한다.
Completion
Record { [[Type]] :
break , [[Value]] :
empty , [[Target]] :
label }를 반환한다.
14.10 return 문
구문
ReturnStatement [Yield,
Await] :
return
;
return
[여기에 LineTerminator 가 없음]
Expression [+In, ?Yield,
?Await]
;
참고
return 문은 함수의 실행을 중단시키고, 대부분의 경우 호출자에게 값을 반환한다. Expression 이 생략되면 반환 값은
undefined 이다. 그렇지 않으면 반환 값은 Expression 의 값이다. return 문은 주변 문맥에
따라 실제로는 호출자에게 값을 반환하지 않을 수도 있다. 예를 들어 try 블록에서 return
문이 실행될 때는 Completion Record 가
finally 블록 평가 중에 다른 Completion
Record 로 대체될 수 있다.
14.10.1 런타임 의미론: 평가
ReturnStatement :
return
;
ReturnCompletion (undefined )를
반환한다.
ReturnStatement :
return
Expression
;
exprRef 를 ? Evaluation of Expression 의 결과로 한다.
exprValue 를 ? GetValue (exprRef )의 결과로 한다.
GetGeneratorKind ()가
async 이면 exprValue 를 ? Await (exprValue )의 결과로 한다.
ReturnCompletion (exprValue )를
반환한다.
14.11 with 문
참고 1
레거시 with 문의 사용은 새로운 ECMAScript
코드에서 지양해야 한다. 엄격 모드 코드 와 비엄격 코드
모두에서 허용되는 구조 분해 할당 과 같은 대안을 고려하라.
구문
WithStatement [Yield, Await,
Return] :
with
(
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
참고 2
with 문은 계산된 객체에 대한 객체 환경 레코드 를
실행 중인 실행 컨텍스트 의 렉시컬 환경에 추가한다. 그런 다음
이 확장된 렉시컬 환경을 사용하여 문을 실행한다. 마지막으로 원래의 렉시컬 환경으로 복원한다.
14.11.1 정적 의미론: 초기 에러
WithStatement :
with
(
Expression
)
Statement
참고
두 번째 규칙은 B.3.1 에 명시된 확장이 구현된
경우에만 적용된다.
14.11.2 런타임 의미론: 평가
WithStatement :
with
(
Expression
)
Statement
val 을 ? Evaluation of Expression 의 결과로 한다.
obj 를 ? ToObject (? GetValue (val ))의 결과로 한다.
oldEnv 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
newEnv 를 NewObjectEnvironment (obj ,
true , oldEnv )로 한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 newEnv 로 설정한다.
C 를 Completion (Evaluation of Statement )의 결과로 한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 oldEnv 로 설정한다.
? UpdateEmpty (C ,
undefined )를 반환한다.
참고
내포된 Statement 를 정상적으로 또는
비정상 완료 나 예외로
벗어나더라도, 렉시컬 환경은 항상 원래 상태로 복원된다.
14.12 switch 문
구문
SwitchStatement [Yield, Await,
Return] :
switch
(
Expression [+In, ?Yield,
?Await]
)
CaseBlock [?Yield, ?Await,
?Return]
CaseBlock [Yield, Await,
Return] :
{
CaseClauses [?Yield, ?Await,
?Return] opt
}
{
CaseClauses [?Yield, ?Await,
?Return] opt
DefaultClause [?Yield, ?Await,
?Return]
CaseClauses [?Yield, ?Await,
?Return] opt
}
CaseClauses [Yield, Await,
Return] :
CaseClause [?Yield, ?Await,
?Return]
CaseClauses [?Yield, ?Await,
?Return]
CaseClause [?Yield, ?Await,
?Return]
CaseClause [Yield, Await,
Return] :
case
Expression [+In, ?Yield,
?Await]
:
StatementList [?Yield, ?Await,
?Return] opt
DefaultClause [Yield, Await,
Return] :
default
:
StatementList [?Yield, ?Await,
?Return] opt
14.12.1 정적 의미론: 초기 에러
SwitchStatement :
switch
(
Expression
)
CaseBlock
14.12.2 런타임 의미론: CaseBlockEvaluation
구문 지시 연산
CaseBlockEvaluation은 인수 input (ECMAScript 언어 값 )을 받고,
정상 완료 로 ECMAScript 언어 값 또는 비정상 완료 를 반환한다. 다음 생성식에 대해
조각별로 정의된다:
CaseBlock :
{
}
undefined 를 반환한다.
CaseBlock :
{
CaseClauses
}
V 를 undefined 로 한다.
A 를 CaseClauses 의 CaseClause 항목들의 소스 텍스트 순서 리스트 로 한다.
found 를 false 로 한다.
A 의 각 CaseClause C 에 대해, 다음을 수행한다:
found 가 false 이면,
found 를 ? CaseClauseIsSelected (C ,
input )의 결과로 설정한다.
found 가 true 이면,
R 을 Completion (Evaluation of C )의
결과로 한다.
R .[[Value]] 가
empty 가 아니면, V 에 R .[[Value]] 를 설정한다.
R 이 비정상
완료 이면, ? UpdateEmpty (R ,
V )를 반환한다.
V 를 반환한다.
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
V 를 undefined 로 한다.
첫 번째 CaseClauses 가 존재하면,
A 를 첫 번째 CaseClauses 의 CaseClause 항목들의 소스
텍스트 순서 리스트 로 한다.
그 외에는,
A 를 새로운 빈 리스트 로 한다.
found 를 false 로 한다.
A 의 각 CaseClause C 에 대해, 다음을 수행한다:
found 가 false 이면,
found 를 ? CaseClauseIsSelected (C ,
input )의 결과로 설정한다.
found 가 true 이면,
R 을 Completion (Evaluation of C )의
결과로 한다.
R .[[Value]] 가
empty 가 아니면, V 에 R .[[Value]] 를 설정한다.
R 이 비정상
완료 이면, ? UpdateEmpty (R ,
V )를 반환한다.
foundInB 를 false 로 한다.
두 번째 CaseClauses 가 존재하면,
B 를 두 번째 CaseClauses 의 CaseClause 항목들의 소스
텍스트 순서 리스트 로 한다.
그 외에는,
B 를 새로운 빈 리스트 로 한다.
found 가 false 이면,
B 의 각 CaseClause C 에 대해, 다음을
수행한다:
foundInB 가 false 이면,
foundInB 를 ? CaseClauseIsSelected (C ,
input )의 결과로 설정한다.
foundInB 가 true 이면,
R 을 Completion (Evaluation of CaseClause
C )의 결과로 한다.
R .[[Value]] 가
empty 가 아니면, V 에
R .[[Value]] 를 설정한다.
R 이 비정상
완료 이면, ? UpdateEmpty (R ,
V )를 반환한다.
foundInB 가 true 이면 V 를 반환한다.
defaultR 을 Completion (Evaluation of DefaultClause )의 결과로 한다.
defaultR .[[Value]] 가 empty 가
아니면, V 에 defaultR .[[Value]] 를 설정한다.
defaultR 이 비정상
완료 이면, ? UpdateEmpty (defaultR ,
V )를 반환한다.
참고: 다음은 두 번째 CaseClauses 의 또 다른 완전 반복이다.
B 의 각 CaseClause C 에 대해, 다음을 수행한다:
R 을 Completion (Evaluation of CaseClause
C )의 결과로 한다.
R .[[Value]] 가 empty 가
아니면, V 에 R .[[Value]] 를 설정한다.
R 이 비정상
완료 이면, ? UpdateEmpty (R ,
V )를 반환한다.
V 를 반환한다.
14.12.3 CaseClauseIsSelected ( C , input )
추상 연산 CaseClauseIsSelected는 인수 C (CaseClause 파스 노드(Parse Node) )와
input (ECMAScript 언어 값 )을 받고, 정상 완료 로 불리언(Boolean) 또는
비정상 완료 를 반환한다. 이 연산은
C 가 input 과 일치하는지 판단한다. 호출 시 다음 단계를 수행한다:
Assert :
C 는 다음 생성식의 인스턴스이다:
CaseClause :
case
Expression
:
StatementList opt
.
exprRef 를 C 의 Expression 에 대해 ? Evaluation 의 결과로 한다.
clauseSelector 를 ? GetValue (exprRef )의 결과로 한다.
IsStrictlyEqual (input ,
clauseSelector )를 반환한다.
참고
이 연산은 C 의 StatementList (있는 경우)를 실행하지 않는다. CaseBlock 알고리즘은 이 반환 값을 사용하여
어느 StatementList 부터
실행을 시작할지 결정한다.
14.12.4 런타임 의미론: 평가
SwitchStatement :
switch
(
Expression
)
CaseBlock
exprRef 를 ? Evaluation of Expression 의 결과로 한다.
switchValue 를 ? GetValue (exprRef )의 결과로 한다.
oldEnv 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
blockEnv 를 NewDeclarativeEnvironment (oldEnv )로
한다.
BlockDeclarationInstantiation (CaseBlock ,
blockEnv )를 수행한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 blockEnv 로 설정한다.
R 을 Completion (CaseBlockEvaluation of CaseBlock 에
switchValue 인수를 넘겨 수행한 결과)로 한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 oldEnv 로 설정한다.
R 을 반환한다.
참고
SwitchStatement 에서
제어가 어떻게 빠져나가든, LexicalEnvironment는 항상 원래 상태로 복원된다.
CaseClause :
case
Expression
:
empty 를 반환한다.
CaseClause :
case
Expression
:
StatementList
? Evaluation of StatementList 의 결과를 반환한다.
DefaultClause :
default
:
empty 를 반환한다.
DefaultClause :
default
:
StatementList
? Evaluation of StatementList 의 결과를 반환한다.
14.13 레이블문
구문
LabelledStatement [Yield, Await,
Return] :
LabelIdentifier [?Yield,
?Await]
:
LabelledItem [?Yield, ?Await,
?Return]
LabelledItem [Yield, Await,
Return] :
Statement [?Yield, ?Await,
?Return]
FunctionDeclaration [?Yield,
?Await, ~Default]
참고
Statement 는 레이블로 접두사를 붙일 수 있다.
레이블문은 레이블이 붙은 break 및 continue 문과 함께 사용할 때만 쓰인다. ECMAScript에는
goto 문이 없다. Statement 는 LabelledStatement 의 일부일 수 있으며, 이는 다시
LabelledStatement 의
일부일 수도 있고, 계속 반복된다. 이렇게 도입된 레이블들은 개별 문들의 의미를 설명할 때 "현재 레이블 집합(current label set)"이라고 한다.
14.13.1 정적 의미론: 초기 에러
LabelledItem : FunctionDeclaration
이 생성식에 의해 소스 텍스트가 매치되면 구문 오류이다.
참고
이 규칙에 대한 대안 정의는 B.3.1 에 제공되어 있다.
14.13.2 정적 의미론: IsLabelledFunction ( stmt )
추상 연산 IsLabelledFunction은 인수 stmt (Statement 파스 노드(Parse Node) )를 받고,
Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
stmt 가 LabelledStatement 가 아니면
false 를 반환한다.
item 을 stmt 의 LabelledItem 로 한다.
item 이
LabelledItem
: FunctionDeclaration
이면 true 를 반환한다.
subStmt 를 item 의 Statement 로 한다.
IsLabelledFunction (subStmt )의
결과를 반환한다.
14.13.3 런타임 의미론: 평가
LabelledStatement
:
LabelIdentifier
:
LabelledItem
? LabelledEvaluation of 이 LabelledStatement
에 인수 « »를 넘겨서 그 결과를 반환한다.
14.13.4 런타임 의미론: LabelledEvaluation
구문 지시 연산
LabelledEvaluation은 인수 labelSet (문자열의 리스트(List) )를 받고, 정상 완료 (ECMAScript 언어 값 또는
empty ) 또는 비정상 완료 를
반환한다. 다음 생성식에 대해 조각별로 정의된다:
BreakableStatement
: IterationStatement
stmtResult 를 Completion (LoopEvaluation of IterationStatement 에
labelSet 인수를 넘겨서 수행한 결과)로 한다.
stmtResult 가 break 완료(break
completion) 이면,
stmtResult .[[Target]] 가
empty 이면,
stmtResult .[[Value]] 가
empty 이면, stmtResult 를 NormalCompletion (undefined )로
설정한다.
그 외에는, stmtResult 를 NormalCompletion (stmtResult .[[Value]] )로 설정한다.
? stmtResult 를 반환한다.
BreakableStatement
: SwitchStatement
stmtResult 를 Completion (Evaluation of SwitchStatement )의 결과로 한다.
stmtResult 가 break 완료(break
completion) 이면,
stmtResult .[[Target]] 가
empty 이면,
stmtResult .[[Value]] 가
empty 이면, stmtResult 를 NormalCompletion (undefined )로
설정한다.
그 외에는, stmtResult 를 NormalCompletion (stmtResult .[[Value]] )로 설정한다.
? stmtResult 를 반환한다.
참고 1
LabelledStatement
:
LabelIdentifier
:
LabelledItem
label 을 LabelIdentifier 의 StringValue 로 한다.
newLabelSet 을 labelSet 과 « label »의 리스트
연결(list-concatenation) 로 한다.
stmtResult 를 Completion (LabelledEvaluation of LabelledItem 에
newLabelSet 인수를 넘겨서 수행한 결과)로 한다.
stmtResult 가 break 완료(break
completion) 이고 stmtResult .[[Target]] 가 label 이면,
stmtResult 를 NormalCompletion (stmtResult .[[Value]] )로 설정한다.
? stmtResult 를 반환한다.
LabelledItem : FunctionDeclaration
? Evaluation of FunctionDeclaration 의 결과를 반환한다.
Statement :
BlockStatement
VariableStatement
EmptyStatement
ExpressionStatement
IfStatement
ContinueStatement
BreakStatement
ReturnStatement
WithStatement
ThrowStatement
TryStatement
DebuggerStatement
? Evaluation of Statement 의 결과를 반환한다.
참고 2
Statement 의 두 가지 생성식만이
LabelledEvaluation에서 특별한 의미를 가진다: BreakableStatement 와 LabelledStatement .
14.14 throw 문
구문
ThrowStatement [Yield,
Await] :
throw
[여기에 LineTerminator 가 없음]
Expression [+In, ?Yield,
?Await]
;
14.14.1 런타임 의미론: 평가
ThrowStatement :
throw
Expression
;
exprRef 를 ? Evaluation of Expression 의 결과로 한다.
exprValue 를 ? GetValue (exprRef )의 결과로 한다.
ThrowCompletion (exprValue )를
반환한다.
14.15 try 문
구문
TryStatement [Yield, Await,
Return] :
try
Block [?Yield, ?Await,
?Return]
Catch [?Yield, ?Await,
?Return]
try
Block [?Yield, ?Await,
?Return]
Finally [?Yield, ?Await,
?Return]
try
Block [?Yield, ?Await,
?Return]
Catch [?Yield, ?Await,
?Return]
Finally [?Yield, ?Await,
?Return]
Catch [Yield, Await,
Return] :
catch
(
CatchParameter [?Yield,
?Await]
)
Block [?Yield, ?Await,
?Return]
catch
Block [?Yield, ?Await,
?Return]
Finally [Yield, Await,
Return] :
finally
Block [?Yield, ?Await,
?Return]
CatchParameter [Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
BindingPattern [?Yield,
?Await]
참고
try 문은 런타임 오류나 throw 문과 같은 예외 상황이 발생할 수 있는 코드 블록을 감싼다.
catch 절은 예외 처리 코드를 제공한다. catch 절이 예외를 포착하면, 그 CatchParameter 가 해당 예외에 바인딩된다.
14.15.1 정적 의미론: 초기 에러
Catch :
catch
(
CatchParameter
)
Block
참고
이 생성식에 대한 대안 정적 의미론 은 B.3.4 에 제시되어 있다.
14.15.2 런타임 의미론: CatchClauseEvaluation
구문 지시 연산
CatchClauseEvaluation은 인수 thrownValue (ECMAScript 언어 값 )을 받고, 정상 완료 (ECMAScript 언어 값 또는
empty ) 또는 비정상 완료 를
반환한다. 다음 생성식에 대해 조각별로 정의된다:
Catch :
catch
(
CatchParameter
)
Block
oldEnv 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
catchEnv 를 NewDeclarativeEnvironment (oldEnv )로
한다.
CatchParameter 의
BoundNames 의 각 요소
argName 에 대해,
! catchEnv .CreateMutableBinding(argName ,
false )을 수행한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 catchEnv 로 설정한다.
status 를 Completion (BindingInitialization of CatchParameter 에
thrownValue 와 catchEnv 인수를 넘겨서 수행한 결과)로 한다.
status 가 비정상
완료 이면,
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 oldEnv 로 설정한다.
? status 를 반환한다.
B 를 Completion (Evaluation of Block )의 결과로 한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 oldEnv 로 설정한다.
? B 를 반환한다.
Catch :
catch
Block
? Evaluation of Block 의 결과를 반환한다.
참고
Block 에서 제어가 어떻게 빠져나가든,
LexicalEnvironment는 항상 원래 상태로 복원된다.
14.15.3 런타임 의미론: 평가
TryStatement :
try
Block
Catch
B 를 Completion (Evaluation of Block )의 결과로 한다.
B 가 throw 완료(throw
completion) 이면, C 를 Completion (CatchClauseEvaluation of Catch 에 B .[[Value]] 인수를 넘겨서 수행한 결과)로 한다.
그 외에는, C 를 B 로 한다.
? UpdateEmpty (C ,
undefined )를 반환한다.
TryStatement :
try
Block
Finally
B 를 Completion (Evaluation of Block )의 결과로 한다.
F 를 Completion (Evaluation of Finally )의 결과로 한다.
F 가 정상 완료(normal
completion) 이면, F 를 B 로 설정한다.
? UpdateEmpty (F ,
undefined )를 반환한다.
TryStatement :
try
Block
Catch
Finally
B 를 Completion (Evaluation of Block )의 결과로 한다.
B 가 throw 완료(throw
completion) 이면, C 를 Completion (CatchClauseEvaluation of Catch 에 B .[[Value]] 인수를 넘겨서 수행한 결과)로 한다.
그 외에는, C 를 B 로 한다.
F 를 Completion (Evaluation of Finally )의 결과로 한다.
F 가 정상 완료(normal
completion) 이면, F 를 C 로 설정한다.
? UpdateEmpty (F ,
undefined )를 반환한다.
14.16 debugger 문
구문
DebuggerStatement :
debugger
;
14.16.1 런타임 의미론: 평가
참고
DebuggerStatement 를
평가하면 구현체가 디버거에서 실행되는 경우 중단점(breakpoint)을 발생시킬 수 있다. 디버거가 없거나 활성화되어 있지 않으면 이 문은 관찰 가능한
효과가 없다.
DebuggerStatement
:
debugger
;
구현 정의 디버깅 기능이 사용 가능하고 활성화된 경우,
구현 정의 디버깅 동작을 수행한다.
새로운 구현 정의
Completion
Record 를 반환한다.
그 외에는,
empty 를 반환한다.
15 ECMAScript 언어: 함수와 클래스
참고
여러 ECMAScript 언어 요소들은 ECMAScript 함수 객체 (10.2 )의 생성을 야기한다. 이러한 함수의
Evaluation 은
[[Call]] 내부 메서드의 실행(10.2.1 )으로
시작한다.
15.1 매개변수 목록
구문
UniqueFormalParameters [Yield,
Await] :
FormalParameters [?Yield,
?Await]
FormalParameters [Yield,
Await] :
[비어 있음]
FunctionRestParameter [?Yield,
?Await]
FormalParameterList [?Yield,
?Await]
FormalParameterList [?Yield,
?Await]
,
FormalParameterList [?Yield,
?Await]
,
FunctionRestParameter [?Yield,
?Await]
FormalParameterList [Yield,
Await] :
FormalParameter [?Yield,
?Await]
FormalParameterList [?Yield,
?Await]
,
FormalParameter [?Yield,
?Await]
FunctionRestParameter [Yield,
Await] :
BindingRestElement [?Yield,
?Await]
FormalParameter [Yield,
Await] :
BindingElement [?Yield,
?Await]
15.1.1 정적 의미론: 초기 에러
UniqueFormalParameters
: FormalParameters
FormalParameters :
FormalParameterList
참고
같은 BindingIdentifier 가 FormalParameterList 에 여러 번 등장하는 것은,
함수가 단순 매개변수 목록을 가지고 있고 엄격 모드 코드 에서 정의되지 않은 경우에만 허용된다.
15.1.2 정적 의미론: ContainsExpression
구문 지시 연산
ContainsExpression은 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:
ObjectBindingPattern
:
{
}
{
BindingRestProperty
}
false 를 반환한다.
ObjectBindingPattern
:
{
BindingPropertyList
,
BindingRestProperty
}
ContainsExpression
of BindingPropertyList 를 반환한다.
ArrayBindingPattern
:
[
Elision opt
]
false 를 반환한다.
ArrayBindingPattern
:
[
Elision opt
BindingRestElement
]
ContainsExpression
of BindingRestElement 를 반환한다.
ArrayBindingPattern
:
[
BindingElementList
,
Elision opt
]
ContainsExpression
of BindingElementList 를 반환한다.
ArrayBindingPattern
:
[
BindingElementList
,
Elision opt
BindingRestElement
]
has 를 ContainsExpression
of BindingElementList 로 한다.
has 가 true 이면 true 를 반환한다.
ContainsExpression
of BindingRestElement 를 반환한다.
BindingPropertyList
:
BindingPropertyList
,
BindingProperty
has 를 ContainsExpression
of BindingPropertyList 로 한다.
has 가 true 이면 true 를 반환한다.
ContainsExpression
of BindingProperty 를
반환한다.
BindingElementList
:
BindingElementList
,
BindingElisionElement
has 를 ContainsExpression
of BindingElementList 로 한다.
has 가 true 이면 true 를 반환한다.
ContainsExpression
of BindingElisionElement 를 반환한다.
BindingElisionElement
:
Elision opt
BindingElement
ContainsExpression
of BindingElement 를
반환한다.
BindingProperty :
PropertyName
:
BindingElement
has 를 IsComputedPropertyKey
of PropertyName 로 한다.
has 가 true 이면 true 를 반환한다.
ContainsExpression
of BindingElement 를
반환한다.
BindingElement :
BindingPattern
Initializer
true 를 반환한다.
SingleNameBinding
: BindingIdentifier
false 를 반환한다.
SingleNameBinding
:
BindingIdentifier
Initializer
true 를 반환한다.
BindingRestElement
:
...
BindingIdentifier
false 를 반환한다.
BindingRestElement
:
...
BindingPattern
ContainsExpression
of BindingPattern 를
반환한다.
FormalParameters :
[비어 있음]
false 를 반환한다.
FormalParameters :
FormalParameterList
,
FunctionRestParameter
ContainsExpression
of FormalParameterList 가
true 이면 true 를 반환한다.
ContainsExpression
of FunctionRestParameter 를 반환한다.
FormalParameterList
:
FormalParameterList
,
FormalParameter
ContainsExpression
of FormalParameterList 가
true 이면 true 를 반환한다.
ContainsExpression
of FormalParameter 를
반환한다.
ArrowParameters :
BindingIdentifier
false 를 반환한다.
ArrowParameters :
CoverParenthesizedExpressionAndArrowParameterList
formals 를 ArrowFormalParameters 로 한다. 이는
cover 된 CoverParenthesizedExpressionAndArrowParameterList 에
의해 얻어진다.
ContainsExpression
of formals 를 반환한다.
AsyncArrowBindingIdentifier
: BindingIdentifier
false 를 반환한다.
15.1.3 정적 의미론: IsSimpleParameterList
구문 지시 연산
IsSimpleParameterList는 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:
BindingElement :
BindingPattern
false 를 반환한다.
BindingElement :
BindingPattern
Initializer
false 를 반환한다.
SingleNameBinding
: BindingIdentifier
true 를 반환한다.
SingleNameBinding
:
BindingIdentifier
Initializer
false 를 반환한다.
FormalParameters :
[empty]
true 를 반환한다.
FormalParameters :
FunctionRestParameter
false 를 반환한다.
FormalParameters :
FormalParameterList
,
FunctionRestParameter
false 를 반환한다.
FormalParameterList
:
FormalParameterList
,
FormalParameter
IsSimpleParameterList
of FormalParameterList 가
false 이면 false 를 반환한다.
IsSimpleParameterList
of FormalParameter 를
반환한다.
FormalParameter :
BindingElement
IsSimpleParameterList
of BindingElement 를
반환한다.
ArrowParameters :
BindingIdentifier
true 를 반환한다.
ArrowParameters :
CoverParenthesizedExpressionAndArrowParameterList
formals 를 ArrowFormalParameters 로 한다. 이는
cover 된 CoverParenthesizedExpressionAndArrowParameterList 에
의해 얻어진다.
IsSimpleParameterList
of formals 를 반환한다.
AsyncArrowBindingIdentifier
: BindingIdentifier
true 를 반환한다.
CoverCallExpressionAndAsyncArrowHead
:
MemberExpression
Arguments
head 를 AsyncArrowHead 로 한다. 이는 cover 된 CoverCallExpressionAndAsyncArrowHead 에
의해 얻어진다.
IsSimpleParameterList
of head 를 반환한다.
15.1.4 정적 의미론: HasInitializer
구문 지시 연산
HasInitializer는 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:
BindingElement :
BindingPattern
false 를 반환한다.
BindingElement :
BindingPattern
Initializer
true 를 반환한다.
SingleNameBinding
: BindingIdentifier
false 를 반환한다.
SingleNameBinding
:
BindingIdentifier
Initializer
true 를 반환한다.
FormalParameterList
:
FormalParameterList
,
FormalParameter
HasInitializer of
FormalParameterList 가
true 이면 true 를 반환한다.
HasInitializer of
FormalParameter 를
반환한다.
15.1.5 정적 의미론: ExpectedArgumentCount
구문 지시 연산
ExpectedArgumentCount는 인수를 받지 않고 음이 아닌 정수 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
FormalParameters :
[비어 있음]
FunctionRestParameter
0을 반환한다.
FormalParameters :
FormalParameterList
,
FunctionRestParameter
FormalParameterList 의 ExpectedArgumentCount 를
반환한다.
참고
FormalParameterList 의
ExpectedArgumentCount는 나머지 매개변수 또는 첫 번째 FormalParameter 가 Initializer를 가진 경우 그
왼쪽에 있는 FormalParameters 의 개수이다. 초기화자가 없는
FormalParameter 가
초기화자를 가진 매개변수 뒤에 오는 것은 허용되지만, 이러한 매개변수는 undefined 를 기본값으로 하는 선택적 매개변수로
간주된다.
FormalParameterList
: FormalParameter
FormalParameter 의
HasInitializer 가
true 이면 0을 반환한다.
1을 반환한다.
FormalParameterList
:
FormalParameterList
,
FormalParameter
count 를 FormalParameterList 의 ExpectedArgumentCount 로
한다.
FormalParameterList 의 HasInitializer 가
true 이거나 FormalParameter 의 HasInitializer 가
true 이면 count 를 반환한다.
count + 1을 반환한다.
ArrowParameters :
BindingIdentifier
1을 반환한다.
ArrowParameters :
CoverParenthesizedExpressionAndArrowParameterList
formals 를 ArrowFormalParameters 로 한다. 이는
cover 된 CoverParenthesizedExpressionAndArrowParameterList 에
의해 얻어진다.
formals 의 ExpectedArgumentCount 를
반환한다.
PropertySetParameterList
: FormalParameter
FormalParameter 의
HasInitializer 가
true 이면 0을 반환한다.
1을 반환한다.
AsyncArrowBindingIdentifier
: BindingIdentifier
1을 반환한다.
15.2 함수 정의
구문
FunctionDeclaration [Yield,
Await, Default] :
function
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [~Yield,
~Await]
)
{
FunctionBody [~Yield,
~Await]
}
[+Default]
function
(
FormalParameters [~Yield,
~Await]
)
{
FunctionBody [~Yield,
~Await]
}
FunctionExpression :
function
BindingIdentifier [~Yield,
~Await] opt
(
FormalParameters [~Yield,
~Await]
)
{
FunctionBody [~Yield,
~Await]
}
FunctionBody [Yield,
Await] :
FunctionStatementList [?Yield,
?Await]
FunctionStatementList [Yield,
Await] :
StatementList [?Yield, ?Await,
+Return] opt
15.2.1 정적 의미론: 초기 에러
FunctionDeclaration
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
FunctionExpression
:
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
참고
FunctionBody 의 LexicallyDeclaredNames 에는
var 또는 function 선언을 통해 바인딩된 식별자가 포함되지 않는다.
FunctionBody : FunctionStatementList
15.2.2 정적 의미론: FunctionBodyContainsUseStrict
구문 지시 연산
FunctionBodyContainsUseStrict는 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:
FunctionBody : FunctionStatementList
FunctionBody 의
Directive Prologue 에 Use
Strict Directive 가 포함되어 있으면 true 를 반환하고, 그렇지 않으면
false 를 반환한다.
15.2.3 런타임 의미론: EvaluateFunctionBody
구문 지시 연산
EvaluateFunctionBody는 인수 functionObject (ECMAScript 함수 객체 )와
argumentsList (List of
ECMAScript 언어 값 )를 받고, return 완료(return
completion) 또는 throw 완료(throw
completion) 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
FunctionBody : FunctionStatementList
? FunctionDeclarationInstantiation (functionObject ,
argumentsList )를 수행한다.
? Evaluation of FunctionStatementList 를 수행한다.
참고: 이전 단계가 정상 완료(normal
completion) 를 반환했다면, FunctionStatementList 의 끝까지 평가가
진행된 것이다.
ReturnCompletion (undefined )를
반환한다.
15.2.4 런타임 의미론: InstantiateOrdinaryFunctionObject
구문 지시 연산
InstantiateOrdinaryFunctionObject는 인수 env (Environment Record )와
privateEnv (PrivateEnvironment Record 또는
null )를 받고, ECMAScript 함수 객체 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
FunctionDeclaration
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
name 을 BindingIdentifier 의 StringValue 로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) FunctionDeclaration 로 한다.
F 를 OrdinaryFunctionCreate (%Function.prototype% ,
sourceText , FormalParameters , FunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (F ,
name )를 수행한다.
MakeConstructor (F )를 수행한다.
F 를 반환한다.
FunctionDeclaration
:
function
(
FormalParameters
)
{
FunctionBody
}
sourceText 를 매치된 소스 텍스트(source
text matched by) FunctionDeclaration 로 한다.
F 를 OrdinaryFunctionCreate (%Function.prototype% ,
sourceText , FormalParameters , FunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (F ,
"default" )를 수행한다.
MakeConstructor (F )를 수행한다.
F 를 반환한다.
참고
익명 FunctionDeclaration 은
export default 선언의 일부로만 등장할 수 있으며, 그 함수 코드는 항상 엄격 모드
코드(strict mode code) 이다.
15.2.5 런타임 의미론: InstantiateOrdinaryFunctionExpression
구문 지시 연산
InstantiateOrdinaryFunctionExpression은 선택적 인수 name (property key 또는 Private
Name )를 받고, ECMAScript 함수 객체 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
FunctionExpression
:
function
(
FormalParameters
)
{
FunctionBody
}
name 이 존재하지 않으면 name 을 "" 로 설정한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) FunctionExpression 로 한다.
closure 를 OrdinaryFunctionCreate (%Function.prototype% ,
sourceText , FormalParameters , FunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (closure ,
name )를 수행한다.
MakeConstructor (closure )를
수행한다.
closure 를 반환한다.
FunctionExpression
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
Assert :
name 이 존재하지 않는다.
name 을 BindingIdentifier 의 StringValue 로 한다.
outerEnv 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
funcEnv 를 NewDeclarativeEnvironment (outerEnv )로
한다.
! funcEnv .CreateImmutableBinding(name ,
false )를 수행한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) FunctionExpression 로 한다.
closure 를 OrdinaryFunctionCreate (%Function.prototype% ,
sourceText , FormalParameters , FunctionBody ,
non-lexical-this , funcEnv , privateEnv )로 한다.
SetFunctionName (closure ,
name )를 수행한다.
MakeConstructor (closure )를
수행한다.
! funcEnv .InitializeBinding(name ,
closure )를 수행한다.
closure 를 반환한다.
참고
15.2.6 런타임 의미론: 평가
FunctionDeclaration
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
empty 를 반환한다.
참고 1
FunctionDeclaration
:
function
(
FormalParameters
)
{
FunctionBody
}
empty 를 반환한다.
FunctionExpression
:
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
InstantiateOrdinaryFunctionExpression
of FunctionExpression 의 결과를 반환한다.
참고 2
FunctionDeclaration 또는 FunctionExpression 을
사용하여 정의된 모든 함수에는 "prototype" 프로퍼티가 자동으로 생성되어, 해당 함수가 생성자(constructor) 로 사용될 가능성을 허용한다.
FunctionStatementList
: [비어
있음]
undefined 를 반환한다.
15.3 화살표 함수 정의
구문
ArrowFunction [In, Yield,
Await] :
ArrowParameters [?Yield,
?Await]
[여기에 LineTerminator 가 없음]
=>
ConciseBody [?In]
ArrowParameters [Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
CoverParenthesizedExpressionAndArrowParameterList [?Yield,
?Await]
ConciseBody [In]
:
[선행 기호 ≠ { ]
ExpressionBody [?In,
~Await]
{
FunctionBody [~Yield,
~Await]
}
ExpressionBody [In,
Await] :
AssignmentExpression [?In,
~Yield, ?Await]
보충 구문
다음 생성식의 인스턴스를 처리할 때
ArrowParameters [Yield,
Await] : CoverParenthesizedExpressionAndArrowParameterList [?Yield,
?Await]
CoverParenthesizedExpressionAndArrowParameterList 의
해석은 아래의 문법을 사용하여 정제된다:
ArrowFormalParameters [Yield,
Await] :
(
UniqueFormalParameters [?Yield,
?Await]
)
15.3.1 정적 의미론: 초기 에러
ArrowFunction :
ArrowParameters
=>
ConciseBody
ArrowParameters :
CoverParenthesizedExpressionAndArrowParameterList
15.3.2 정적 의미론: ConciseBodyContainsUseStrict
구문 지시 연산
ConciseBodyContainsUseStrict는 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:
ConciseBody : ExpressionBody
false 를 반환한다.
ConciseBody :
{
FunctionBody
}
FunctionBodyContainsUseStrict
of FunctionBody 를 반환한다.
15.3.3 런타임 의미론: EvaluateConciseBody
구문 지시 연산
EvaluateConciseBody는 인수 functionObject (ECMAScript 함수 객체 )와
argumentsList (List of
ECMAScript 언어 값 )를 받고, return 완료(return
completion) 또는 throw 완료(throw
completion) 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
ConciseBody : ExpressionBody
? FunctionDeclarationInstantiation (functionObject ,
argumentsList )를 수행한다.
? Evaluation of ExpressionBody 를 반환한다.
15.3.4 런타임 의미론: InstantiateArrowFunctionExpression
구문 지시 연산
InstantiateArrowFunctionExpression은 선택적 인수 name (property key 또는 Private
Name )를 받고, ECMAScript 함수 객체 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
ArrowFunction :
ArrowParameters
=>
ConciseBody
name 이 존재하지 않으면 name 을 "" 로 설정한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) ArrowFunction 로 한다.
closure 를 OrdinaryFunctionCreate (%Function.prototype% ,
sourceText , ArrowParameters , ConciseBody ,
lexical-this , env , privateEnv )로 한다.
SetFunctionName (closure ,
name )를 수행한다.
closure 를 반환한다.
참고
ArrowFunction 은
arguments, super, this, new.target에
대한 지역 바인딩을 정의하지 않는다. ArrowFunction 내에서
arguments, super, this, new.target에
대한 참조는 반드시 렉시컬 상위 환경의 바인딩을 참조해야 한다. 일반적으로 이는 바로 상위 함수의 Function Environment가 된다. ArrowFunction 이
super를 포함하더라도, 함수 객체 는 5 단계에서
MakeMethod 를 통해 메서드로 만들어지지 않는다. ArrowFunction 이
super를 참조하는 경우, 반드시 비-ArrowFunction 내에 포함되어 있고, 함수
객체 가 캡처한 env 를 통해 super를 구현하는 데 필요한 상태를 접근할
수 있다.
15.3.5 런타임 의미론: 평가
ArrowFunction :
ArrowParameters
=>
ConciseBody
InstantiateArrowFunctionExpression
of ArrowFunction 의 결과를
반환한다.
ExpressionBody :
AssignmentExpression
exprRef 를 ? Evaluation of AssignmentExpression 의 결과로 한다.
exprValue 를 ? GetValue (exprRef )의 결과로 한다.
ReturnCompletion (exprValue )를
반환한다.
15.4 메서드 정의
구문
MethodDefinition [Yield,
Await] :
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [~Yield,
~Await]
)
{
FunctionBody [~Yield,
~Await]
}
GeneratorMethod [?Yield,
?Await]
AsyncMethod [?Yield,
?Await]
AsyncGeneratorMethod [?Yield,
?Await]
get
ClassElementName [?Yield,
?Await]
(
)
{
FunctionBody [~Yield,
~Await]
}
set
ClassElementName [?Yield,
?Await]
(
PropertySetParameterList
)
{
FunctionBody [~Yield,
~Await]
}
PropertySetParameterList
:
FormalParameter [~Yield,
~Await]
15.4.1 정적 의미론: 초기 에러
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
MethodDefinition :
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
15.4.2 정적 의미론: HasDirectSuper
구문 지시 연산
HasDirectSuper는 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
UniqueFormalParameters
Contains SuperCall 이
true 이면 true 를 반환한다.
FunctionBody Contains SuperCall 의 결과를 반환한다.
MethodDefinition :
get
ClassElementName
(
)
{
FunctionBody
}
FunctionBody Contains SuperCall 의 결과를 반환한다.
MethodDefinition :
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
PropertySetParameterList
Contains SuperCall 이
true 이면 true 를 반환한다.
FunctionBody Contains SuperCall 의 결과를 반환한다.
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
UniqueFormalParameters
Contains SuperCall 이
true 이면 true 를 반환한다.
GeneratorBody
Contains SuperCall 의 결과를 반환한다.
AsyncGeneratorMethod
:
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
UniqueFormalParameters
Contains SuperCall 이
true 이면 true 를 반환한다.
AsyncGeneratorBody Contains SuperCall 의 결과를 반환한다.
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
UniqueFormalParameters
Contains SuperCall 이
true 이면 true 를 반환한다.
AsyncFunctionBody
Contains SuperCall 의 결과를 반환한다.
15.4.3 정적 의미론: SpecialMethod
구문 지시 연산
SpecialMethod는 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
false 를 반환한다.
MethodDefinition :
GeneratorMethod
AsyncMethod
AsyncGeneratorMethod
get
ClassElementName
(
)
{
FunctionBody
}
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
true 를 반환한다.
15.4.4 런타임 의미론: DefineMethod
구문 지시 연산
DefineMethod는 인수 object (Object)와 선택적 인수 functionPrototype (Object)를 받고,
정상 완료(normal
completion) (Record , 필드
[[Key]] (property key )와 [[Closure]] (ECMAScript 함수 객체 )) 또는 비정상 완료(abrupt
completion) 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
propKey 를 ? Evaluation of ClassElementName 의 결과로
한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
functionPrototype 이 존재하면,
prototype 을 functionPrototype 으로 한다.
그 외에는,
prototype 을 %Function.prototype% 로
한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) MethodDefinition 로 한다.
closure 를 OrdinaryFunctionCreate (prototype ,
sourceText , UniqueFormalParameters , FunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
MakeMethod (closure ,
object )를 수행한다.
Record { [[Key]] : propKey , [[Closure]] : closure }를 반환한다.
15.4.5 런타임 의미론: MethodDefinitionEvaluation
구문 지시 연산
MethodDefinitionEvaluation은 인수 object (Object)와 enumerable (Boolean)을 받고,
정상 완료 (PrivateElement 또는
unused ), 또는 비정상 완료 를
반환한다. 다음 생성식에 대해 조각별로 정의된다:
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
methodDef 를 ? DefineMethod of MethodDefinition 에 object
인수를 넘겨서 수행한 결과로 한다.
SetFunctionName (methodDef .[[Closure]] , methodDef .[[Key]] )를 수행한다.
? DefineMethodProperty (object ,
methodDef .[[Key]] , methodDef .[[Closure]] , enumerable )를 반환한다.
MethodDefinition :
get
ClassElementName
(
)
{
FunctionBody
}
propKey 를 ? Evaluation of ClassElementName 의 결과로
한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) MethodDefinition 로 한다.
formalParameterList 를 아래 생성식의 인스턴스로 한다:
FormalParameters
: [비어
있음]
.
closure 를 OrdinaryFunctionCreate (%Function.prototype% ,
sourceText , formalParameterList , FunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
MakeMethod (closure ,
object )를 수행한다.
SetFunctionName (closure ,
propKey , "get" )를 수행한다.
propKey 가 Private Name 이면,
PrivateElement
{ [[Key]] : propKey , [[Kind]] : accessor , [[Get]] : closure , [[Set]] : undefined }를 반환한다.
그 외에는,
desc 를 PropertyDescriptor { [[Get]] :
closure , [[Enumerable]] :
enumerable , [[Configurable]] :
true }로 한다.
? DefinePropertyOrThrow (object ,
propKey , desc )를 수행한다.
unused 를 반환한다.
MethodDefinition :
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
propKey 를 ? Evaluation of ClassElementName 의 결과로
한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) MethodDefinition 로 한다.
closure 를 OrdinaryFunctionCreate (%Function.prototype% ,
sourceText , PropertySetParameterList ,
FunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
MakeMethod (closure ,
object )를 수행한다.
SetFunctionName (closure ,
propKey , "set" )를 수행한다.
propKey 가 Private Name 이면,
PrivateElement
{ [[Key]] : propKey , [[Kind]] : accessor , [[Get]] : undefined , [[Set]] : closure }를 반환한다.
그 외에는,
desc 를 PropertyDescriptor { [[Set]] :
closure , [[Enumerable]] :
enumerable , [[Configurable]] :
true }로 한다.
? DefinePropertyOrThrow (object ,
propKey , desc )를 수행한다.
unused 를 반환한다.
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
propKey 를 ? Evaluation of ClassElementName 의 결과로
한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) GeneratorMethod 로 한다.
closure 를 OrdinaryFunctionCreate (%GeneratorFunction.prototype% ,
sourceText , UniqueFormalParameters , GeneratorBody ,
non-lexical-this , env , privateEnv )로 한다.
MakeMethod (closure ,
object )를 수행한다.
SetFunctionName (closure ,
propKey )를 수행한다.
prototype 을 OrdinaryObjectCreate (%GeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (closure ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
? DefineMethodProperty (object ,
propKey , closure , enumerable )를 반환한다.
AsyncGeneratorMethod
:
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
propKey 를 ? Evaluation of ClassElementName 의 결과로
한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) AsyncGeneratorMethod 로 한다.
closure 를 OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% ,
sourceText , UniqueFormalParameters , AsyncGeneratorBody ,
non-lexical-this , env , privateEnv )로 한다.
MakeMethod (closure ,
object )를 수행한다.
SetFunctionName (closure ,
propKey )를 수행한다.
prototype 을 OrdinaryObjectCreate (%AsyncGeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (closure ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
? DefineMethodProperty (object ,
propKey , closure , enumerable )를 반환한다.
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
propKey 를 ? Evaluation of ClassElementName 의 결과로
한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) AsyncMethod 로 한다.
closure 를 OrdinaryFunctionCreate (%AsyncFunction.prototype% ,
sourceText , UniqueFormalParameters , AsyncFunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
MakeMethod (closure ,
object )를 수행한다.
SetFunctionName (closure ,
propKey )를 수행한다.
? DefineMethodProperty (object ,
propKey , closure , enumerable )를 반환한다.
15.5 제너레이터 함수 정의
구문
GeneratorDeclaration [Yield,
Await, Default] :
function
*
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [+Yield,
~Await]
)
{
GeneratorBody
}
[+Default]
function
*
(
FormalParameters [+Yield,
~Await]
)
{
GeneratorBody
}
GeneratorExpression
:
function
*
BindingIdentifier [+Yield,
~Await] opt
(
FormalParameters [+Yield,
~Await]
)
{
GeneratorBody
}
GeneratorMethod [Yield,
Await] :
*
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [+Yield,
~Await]
)
{
GeneratorBody
}
GeneratorBody :
FunctionBody [+Yield,
~Await]
YieldExpression [In,
Await] :
yield
yield
[여기에 LineTerminator 가 없음]
AssignmentExpression [?In,
+Yield, ?Await]
yield
[여기에 LineTerminator 가 없음]
*
AssignmentExpression [?In,
+Yield, ?Await]
참고 1
yield 바로 뒤의 구문 맥락에서는 InputElementRegExpOrTemplateTail
렉시컬 목표(lexical goal)를 사용해야 한다.
참고 2
YieldExpression 은 제너레이터
함수의 FormalParameters
내에서는 사용할 수 없다. 왜냐하면 FormalParameters 에 포함된 모든 표현식은 Generator가
재개(resumable) 상태가 되기 전에 평가되기 때문이다.
참고 3
15.5.1 정적 의미론: 초기 에러
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
GeneratorDeclaration
:
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
GeneratorExpression
:
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
15.5.2 런타임 의미론: EvaluateGeneratorBody
구문 지시 연산
EvaluateGeneratorBody는 인수 functionObject (ECMAScript 함수 객체 )와
argumentsList (List of
ECMAScript 언어 값 )를 받고, throw 완료(throw
completion) 또는 return 완료(return
completion) 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
GeneratorBody :
FunctionBody
? FunctionDeclarationInstantiation (functionObject ,
argumentsList )를 수행한다.
G 를 ? OrdinaryCreateFromConstructor (functionObject ,
"%GeneratorPrototype%" , « [[GeneratorState]] , [[GeneratorContext]] , [[GeneratorBrand]] »)의 결과로 한다.
G .[[GeneratorBrand]] 를 empty 로
설정한다.
G .[[GeneratorState]] 를
suspended-start 로 설정한다.
GeneratorStart (G , FunctionBody )를 수행한다.
ReturnCompletion (G )를
반환한다.
15.5.3 런타임 의미론: InstantiateGeneratorFunctionObject
구문 지시 연산
InstantiateGeneratorFunctionObject는 인수 env (Environment Record )와
privateEnv (PrivateEnvironment Record 또는
null )를 받고, ECMAScript 함수 객체 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
GeneratorDeclaration
:
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
name 을 BindingIdentifier 의 StringValue 로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) GeneratorDeclaration 로 한다.
F 를 OrdinaryFunctionCreate (%GeneratorFunction.prototype% ,
sourceText , FormalParameters , GeneratorBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (F ,
name )를 수행한다.
prototype 을 OrdinaryObjectCreate (%GeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (F ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
F 를 반환한다.
GeneratorDeclaration
:
function
*
(
FormalParameters
)
{
GeneratorBody
}
sourceText 를 GeneratorDeclaration 에 의해
매치된 소스 텍스트(source
text matched by) 로 한다.
F 를 OrdinaryFunctionCreate (%GeneratorFunction.prototype% ,
sourceText , FormalParameters , GeneratorBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (F ,
"default" )를 수행한다.
prototype 을 OrdinaryObjectCreate (%GeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (F ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
F 를 반환한다.
참고
익명 GeneratorDeclaration 은
export default 선언의 일부로만 등장할 수 있으며, 해당 함수 코드는 항상 엄격 모드
코드(strict mode code) 이다.
15.5.4 런타임 의미론: InstantiateGeneratorFunctionExpression
구문 지시 연산
InstantiateGeneratorFunctionExpression은 선택적 인수 name (property key 또는 Private
Name )를 받고 ECMAScript 함수 객체 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
GeneratorExpression
:
function
*
(
FormalParameters
)
{
GeneratorBody
}
name 이 존재하지 않으면 name 을 "" 로 설정한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) GeneratorExpression 로 한다.
closure 를 OrdinaryFunctionCreate (%GeneratorFunction.prototype% ,
sourceText , FormalParameters , GeneratorBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (closure ,
name )를 수행한다.
prototype 을 OrdinaryObjectCreate (%GeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (closure ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
closure 를 반환한다.
GeneratorExpression
:
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
Assert :
name 이 존재하지 않는다.
name 을 BindingIdentifier 의 StringValue 로 한다.
outerEnv 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
funcEnv 를 NewDeclarativeEnvironment (outerEnv )로
한다.
! funcEnv .CreateImmutableBinding(name ,
false )를 수행한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) GeneratorExpression 로 한다.
closure 를 OrdinaryFunctionCreate (%GeneratorFunction.prototype% ,
sourceText , FormalParameters , GeneratorBody ,
non-lexical-this , funcEnv , privateEnv )로 한다.
SetFunctionName (closure ,
name )를 수행한다.
prototype 을 OrdinaryObjectCreate (%GeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (closure ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
! funcEnv .InitializeBinding(name ,
closure )를 수행한다.
closure 를 반환한다.
참고
15.5.5 런타임 의미론: 평가
GeneratorExpression
:
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
InstantiateGeneratorFunctionExpression
of GeneratorExpression 의 결과를 반환한다.
YieldExpression :
yield
? Yield (undefined )를 반환한다.
YieldExpression :
yield
AssignmentExpression
exprRef 를 ? Evaluation of AssignmentExpression 의 결과로 한다.
value 를 ? GetValue (exprRef )의 결과로 한다.
? Yield (value )를 반환한다.
YieldExpression :
yield
*
AssignmentExpression
generatorKind 를 GetGeneratorKind ()의 결과로 한다.
Assert :
generatorKind 는 sync 또는 async 이다.
exprRef 를 ? Evaluation of AssignmentExpression 의 결과로 한다.
value 를 ? GetValue (exprRef )의 결과로 한다.
iteratorRecord 를 ? GetIterator (value ,
generatorKind )의 결과로 한다.
iterator 를 iteratorRecord .[[Iterator]] 로
한다.
received 를 NormalCompletion (undefined )로
한다.
반복한다,
received 가 정상
완료(normal completion) 이면,
innerResult 를 ? Call (iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] , « received .[[Value]] »)의 결과로 한다.
generatorKind 가 async 이면,
innerResult 를 ? Await (innerResult )의
결과로 설정한다.
innerResult 가 객체가 아니면 ,
TypeError 예외를 던진다.
done 를 ? IteratorComplete (innerResult )의
결과로 한다.
done 이 true 이면,
? IteratorValue (innerResult )를
반환한다.
generatorKind 가 async 이면,
received 를 Completion (AsyncGeneratorYield (?
IteratorValue (innerResult )))로
설정한다.
그 외에는, received 를 Completion (GeneratorYield (innerResult ))로
설정한다.
그 외에 received 가 throw 완료(throw
completion) 이면,
throw 를 ? GetMethod (iterator ,
"throw" )의 결과로 한다.
throw 가 undefined 가 아니면,
innerResult 를 ? Call (throw ,
iterator , « received .[[Value]] »)의 결과로 한다.
generatorKind 가 async 이면,
innerResult 를 ? Await (innerResult )의
결과로 설정한다.
참고: 내부 iterator
throw 메서드의 예외는 전파된다. 내부 throw 메서드의
정상
완료(normal completion) 는 내부
next와 유사하게 처리된다.
innerResult 가 객체가
아니면 , TypeError 예외를
던진다.
done 를 ? IteratorComplete (innerResult )의
결과로 한다.
done 이 true 이면,
? IteratorValue (innerResult )를
반환한다.
generatorKind 가 async 이면,
received 를 Completion (AsyncGeneratorYield (?
IteratorValue (innerResult )))로
설정한다.
그 외에는, received 를 Completion (GeneratorYield (innerResult ))로
설정한다.
그 외에는,
참고: iterator 에 throw 메서드가 없으면, 이 throw는
yield* 루프를 종료한다. 단, 먼저 iterator 에
정리(clean up) 기회를 준다.
closeCompletion 을 NormalCompletion (empty )로
한다.
generatorKind 가 async 이면, ?
AsyncIteratorClose (iteratorRecord ,
closeCompletion )를 수행한다.
그 외에는, ? IteratorClose (iteratorRecord ,
closeCompletion )를 수행한다.
참고: 다음 단계는 yield* 프로토콜 위반을 나타내기 위해
TypeError 를 던진다: iterator 에
throw 메서드가 없다.
TypeError 예외를 던진다.
그 외에는,
Assert : received 는
return
완료(return completion) 이다.
return 을 ? GetMethod (iterator ,
"return" )의 결과로 한다.
return 이 undefined 이면,
value 를 received .[[Value]] 로 설정한다.
generatorKind 가 async 이면,
value 를 ? Await (value )의
결과로 설정한다.
ReturnCompletion (value )를
반환한다.
innerReturnResult 를 ? Call (return ,
iterator , « received .[[Value]] »)의 결과로 한다.
generatorKind 가 async 이면,
innerReturnResult 를 ? Await (innerReturnResult )의
결과로 설정한다.
innerReturnResult 가 객체가 아니면 ,
TypeError 예외를 던진다.
done 를 ? IteratorComplete (innerReturnResult )의
결과로 한다.
done 이 true 이면,
value 를 ? IteratorValue (innerReturnResult )의
결과로 설정한다.
ReturnCompletion (value )를
반환한다.
generatorKind 가 async 이면,
received 를 Completion (AsyncGeneratorYield (?
IteratorValue (innerReturnResult )))로
설정한다.
그 외에는, received 를 Completion (GeneratorYield (innerReturnResult ))로
설정한다.
15.6 비동기 제너레이터 함수 정의
구문
AsyncGeneratorDeclaration [Yield,
Await, Default] :
async
[여기에는 LineTerminator 없음]
function
*
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
[+Default]
async
[여기에는 LineTerminator 없음]
function
*
(
FormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression
:
async
[여기에는 LineTerminator 없음]
function
*
BindingIdentifier [+Yield,
+Await] opt
(
FormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorMethod [Yield,
Await] :
async
[여기에는 LineTerminator 없음]
*
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorBody :
FunctionBody [+Yield,
+Await]
참고 1
YieldExpression 과
AwaitExpression 은
비동기 제너레이터 함수의 FormalParameters 내에서 사용할 수 없습니다. 왜냐하면
FormalParameters 의 일부인
모든 식은
생성된 AsyncGenerator가 재개 가능한 상태가 되기 전에 평가되기 때문입니다.
참고 2
15.6.1 정적 의미론: 초기 오류
AsyncGeneratorMethod
:
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
AsyncGeneratorDeclaration
:
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression
:
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
15.6.2 실행 시 의미론: EvaluateAsyncGeneratorBody
구문 지향 연산
EvaluateAsyncGeneratorBody는
functionObject (ECMAScript 함수 객체 )와 argumentsList (List 타입의 ECMAScript 언어 값 목록) 인자를 받고,
throw completion 또는
return completion 을
반환합니다.
다음 생성식에 대해 개별적으로 정의됩니다:
AsyncGeneratorBody
: FunctionBody
? FunctionDeclarationInstantiation (functionObject ,
argumentsList )를 수행한다.
generator 를 ? OrdinaryCreateFromConstructor (functionObject ,
"%AsyncGeneratorPrototype%" , « [[AsyncGeneratorState]] , [[AsyncGeneratorContext]] , [[AsyncGeneratorQueue]] , [[GeneratorBrand]] »)로 한다.
generator .[[GeneratorBrand]] 를
empty 로 설정한다.
generator .[[AsyncGeneratorState]] 를
suspended-start 로 설정한다.
AsyncGeneratorStart (generator ,
FunctionBody )를 수행한다.
ReturnCompletion (generator )를
반환한다.
15.6.3 실행 시 의미론: InstantiateAsyncGeneratorFunctionObject
구문 지향 연산
InstantiateAsyncGeneratorFunctionObject는
env (Environment Record 타입)와
privateEnv (PrivateEnvironment Record 또는
null ) 인자를 받고, ECMAScript 함수 객체 를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
AsyncGeneratorDeclaration
:
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
name 을 StringValue of BindingIdentifier 로
한다.
sourceText 를 AsyncGeneratorDeclaration에
매치된 소스 텍스트 로 한다.
F 를 OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% ,
sourceText , FormalParameters , AsyncGeneratorBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (F ,
name )을 수행한다.
prototype 을 OrdinaryObjectCreate (%AsyncGeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (F ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
F 를 반환한다.
AsyncGeneratorDeclaration
:
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
sourceText 를 AsyncGeneratorDeclaration에
매치된 소스 텍스트 로 한다.
F 를 OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% ,
sourceText , FormalParameters , AsyncGeneratorBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (F ,
"default" )를 수행한다.
prototype 을 OrdinaryObjectCreate (%AsyncGeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (F ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
F 를 반환한다.
참고
익명 AsyncGeneratorDeclaration 은
export default 선언의 일부로만 나타날 수 있습니다.
15.6.4 실행 시 의미론:
InstantiateAsyncGeneratorFunctionExpression
구문 지향 연산
InstantiateAsyncGeneratorFunctionExpression은 선택적 인자 name (프로퍼티 키 또는
Private
Name )를 받고,
ECMAScript 함수
객체 를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
AsyncGeneratorExpression
:
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
name 이 존재하지 않으면 name 을 "" 로 설정한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 AsyncGeneratorExpression에
매치된 소스 텍스트 로 한다.
closure 를 OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% ,
sourceText , FormalParameters , AsyncGeneratorBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (closure ,
name )을 수행한다.
prototype 을 OrdinaryObjectCreate (%AsyncGeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (closure ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
closure 를 반환한다.
AsyncGeneratorExpression
:
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
Assert :
name 이 존재하지 않는다.
name 을 StringValue of BindingIdentifier 로
설정한다.
outerEnv 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
funcEnv 를 NewDeclarativeEnvironment (outerEnv )로
한다.
! funcEnv .CreateImmutableBinding(name ,
false )을 수행한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 AsyncGeneratorExpression에
매치된 소스 텍스트 로 한다.
closure 를 OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% ,
sourceText , FormalParameters , AsyncGeneratorBody ,
non-lexical-this , funcEnv , privateEnv )로 한다.
SetFunctionName (closure ,
name )을 수행한다.
prototype 을 OrdinaryObjectCreate (%AsyncGeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (closure ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
! funcEnv .InitializeBinding(name ,
closure )을 수행한다.
closure 를 반환한다.
참고
15.6.5 실행 시 의미론: Evaluation
AsyncGeneratorExpression
:
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
InstantiateAsyncGeneratorFunctionExpression
of AsyncGeneratorExpression 을
반환한다.
15.7 클래스 정의
구문
ClassDeclaration [Yield, Await,
Default] :
class
BindingIdentifier [?Yield,
?Await]
ClassTail [?Yield,
?Await]
[+Default]
class
ClassTail [?Yield,
?Await]
ClassExpression [Yield,
Await] :
class
BindingIdentifier [?Yield,
?Await] opt
ClassTail [?Yield,
?Await]
ClassTail [Yield,
Await] :
ClassHeritage [?Yield,
?Await] opt
{
ClassBody [?Yield,
?Await] opt
}
ClassHeritage [Yield,
Await] :
extends
LeftHandSideExpression [?Yield,
?Await]
ClassBody [Yield,
Await] :
ClassElementList [?Yield,
?Await]
ClassElementList [Yield,
Await] :
ClassElement [?Yield,
?Await]
ClassElementList [?Yield,
?Await]
ClassElement [?Yield,
?Await]
ClassElement [Yield,
Await] :
MethodDefinition [?Yield,
?Await]
static
MethodDefinition [?Yield,
?Await]
FieldDefinition [?Yield,
?Await]
;
static
FieldDefinition [?Yield,
?Await]
;
ClassStaticBlock
;
FieldDefinition [Yield,
Await] :
ClassElementName [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
ClassElementName [Yield,
Await] :
PropertyName [?Yield,
?Await]
PrivateIdentifier
ClassStaticBlock :
static
{
ClassStaticBlockBody
}
ClassStaticBlockBody
:
ClassStaticBlockStatementList
ClassStaticBlockStatementList
:
StatementList [~Yield, +Await,
~Return] opt
참고
15.7.1 정적 의미론: 초기 오류
ClassTail :
ClassHeritage opt
{
ClassBody
}
ClassBody : ClassElementList
ClassElement : MethodDefinition
ClassElement :
static
MethodDefinition
ClassElement :
FieldDefinition
;
ClassElement :
static
FieldDefinition
;
FieldDefinition :
ClassElementName
Initializer opt
ClassElementName :
PrivateIdentifier
ClassStaticBlockBody
: ClassStaticBlockStatementList
15.7.2 정적 의미론: ClassElementKind
구문 지향 연산
ClassElementKind는 인자를 받지 않으며,
constructor-method , non-constructor-method , 또는
empty 를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
ClassElement : MethodDefinition
MethodDefinition 의
PropName 이
"constructor" 이면,
constructor-method 를 반환한다.
non-constructor-method 를 반환한다.
ClassElement :
static
MethodDefinition
FieldDefinition
;
static
FieldDefinition
;
non-constructor-method 를 반환한다.
ClassElement : ClassStaticBlock
non-constructor-method 를 반환한다.
ClassElement : ;
empty 를 반환한다.
15.7.3 정적 의미론: ConstructorMethod
구문 지향 연산
ConstructorMethod는 인자를 받지 않으며,
ClassElement 파싱
노드 또는 empty 를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
ClassElementList :
ClassElement
ClassElement 의
ClassElementKind 가
constructor-method 이면,
ClassElement 를 반환한다.
empty 를 반환한다.
ClassElementList :
ClassElementList
ClassElement
head 를 ConstructorMethod
of ClassElementList 로 한다.
head 가 empty 가 아니면 head 를 반환한다.
ClassElement 의
ClassElementKind 가
constructor-method 이면,
ClassElement 를 반환한다.
empty 를 반환한다.
참고
초기 오류 규칙은 "constructor" 라는 이름의 메서드 정의가 하나만 존재하며, 접근자
프로퍼티 또는 제너레이터 정의가 아님을 보장합니다.
15.7.4 정적 의미론: IsStatic
구문 지향 연산
IsStatic은 인자를 받지 않으며, Boolean을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
ClassElement : MethodDefinition
false 를 반환한다.
ClassElement :
static
MethodDefinition
true 를 반환한다.
ClassElement :
FieldDefinition
;
false 를 반환한다.
ClassElement :
static
FieldDefinition
;
true 를 반환한다.
ClassElement : ClassStaticBlock
true 를 반환한다.
ClassElement : ;
false 를 반환한다.
15.7.5 정적 의미론: NonConstructorElements
구문 지향 연산
NonConstructorElements는 인자를 받지 않으며,
List 타입의 ClassElement 파싱
노드 목록을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
ClassElementList :
ClassElement
ClassElement 의
ClassElementKind 가
non-constructor-method 이면,
« ClassElement »를 반환한다.
새로운 빈 List 를 반환한다.
ClassElementList :
ClassElementList
ClassElement
list 를 NonConstructorElements
of ClassElementList 로 한다.
ClassElement 의
ClassElementKind 가
non-constructor-method 이면,
ClassElement 를
list 의 끝에 추가한다.
list 를 반환한다.
15.7.6 정적 의미론: PrototypePropertyNameList
구문 지향 연산
PrototypePropertyNameList는 인자를 받지 않으며,
List 타입의 프로퍼티 키 목록을 반환합니다.
다음 생성식에 대해 개별적으로 정의됩니다:
ClassElementList :
ClassElement
propName 를 ClassElement 의 PropName 로 한다.
propName 가 empty 이면, 새로운 빈 List 를 반환한다.
ClassElement 의
IsStatic 이
true 이면, 새로운 빈 List 를 반환한다.
« propName »를 반환한다.
ClassElementList :
ClassElementList
ClassElement
list 를 PrototypePropertyNameList
of ClassElementList 로 한다.
propName 를 ClassElement 의 PropName 로 한다.
propName 가 empty 이면 list 를 반환한다.
ClassElement 의
IsStatic 이
true 이면 list 를 반환한다.
list 와 « propName »의 리스트 연결 을 반환한다.
15.7.7 정적 의미론: AllPrivateIdentifiersValid
구문 지향 연산
AllPrivateIdentifiersValid는 names (문자열의 List ) 인자를 받고, Boolean을
반환합니다.
아래에 나열되지 않은 이 명세의 모든 문법 생성식 대안은 암묵적으로 다음의 AllPrivateIdentifiersValid의 기본 정의를 갖습니다:
이 파싱 노드 의 각 자식 노드 child 에
대해,
child 가 비터미널의 인스턴스이면,
child 의 AllPrivateIdentifiersValid 에
names 인자를 넘겨 호출 결과가 false 이면,
false 를 반환한다.
true 를 반환한다.
MemberExpression :
MemberExpression
.
PrivateIdentifier
names 가 PrivateIdentifier 의 StringValue 를 포함하면,
MemberExpression 의 AllPrivateIdentifiersValid 에
names 인자를 넘겨 호출한 결과를 반환한다.
false 를 반환한다.
CallExpression :
CallExpression
.
PrivateIdentifier
names 가 PrivateIdentifier 의 StringValue 를 포함하면,
CallExpression 의 AllPrivateIdentifiersValid 에
names 인자를 넘겨 호출한 결과를 반환한다.
false 를 반환한다.
OptionalChain :
?.
PrivateIdentifier
names 가 PrivateIdentifier 의 StringValue 를 포함하면,
true 를 반환한다.
false 를 반환한다.
OptionalChain :
OptionalChain
.
PrivateIdentifier
names 가 PrivateIdentifier 의 StringValue 를 포함하면,
OptionalChain 의 AllPrivateIdentifiersValid 에
names 인자를 넘겨 호출한 결과를 반환한다.
false 를 반환한다.
ClassBody : ClassElementList
newNames 를 names 와 ClassBody 의 PrivateBoundIdentifiers 의
리스트
연결 로 한다.
ClassElementList 의
AllPrivateIdentifiersValid 에
newNames 인자를 넘겨 호출한 결과를 반환한다.
RelationalExpression
:
PrivateIdentifier
in
ShiftExpression
names 가 PrivateIdentifier 의 StringValue 를 포함하면,
ShiftExpression 의 AllPrivateIdentifiersValid 에
names 인자를 넘겨 호출한 결과를 반환한다.
false 를 반환한다.
15.7.8 정적 의미론: PrivateBoundIdentifiers
구문 지향 연산
PrivateBoundIdentifiers는 인자를 받지 않으며,
문자열의 List 를 반환합니다. 다음 생성식에 대해
개별적으로 정의됩니다:
FieldDefinition :
ClassElementName
Initializer opt
ClassElementName 의
PrivateBoundIdentifiers 를
반환한다.
ClassElementName :
PrivateIdentifier
PrivateIdentifier 의 StringValue 를 유일한 요소로 갖는
List 를 반환한다.
ClassElementName :
PropertyName
ClassElement :
ClassStaticBlock
;
새로운 빈 List 를 반환한다.
ClassElementList :
ClassElementList
ClassElement
names1 를 ClassElementList 의 PrivateBoundIdentifiers 로
한다.
names2 를 ClassElement 의 PrivateBoundIdentifiers 로
한다.
names1 과 names2 의 리스트 연결 을 반환한다.
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
get
ClassElementName
(
)
{
FunctionBody
}
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
AsyncGeneratorMethod
:
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
ClassElementName 의
PrivateBoundIdentifiers 를
반환한다.
15.7.9 정적 의미론: ContainsArguments
구문 지향 연산
ContainsArguments는 인자를 받지 않으며, Boolean을 반환합니다.
아래에 나열되지 않은 이 명세의 모든 문법 생성식 대안은 암묵적으로 다음의 ContainsArguments의 기본 정의를 갖습니다:
이 파싱 노드 의 각 자식 노드 child 에
대해,
child 가 비터미널의 인스턴스이면,
child 의 ContainsArguments 가
true 이면, true 를 반환한다.
false 를 반환한다.
IdentifierReference
: Identifier
Identifier 의 StringValue 가
"arguments" 이면, true 를 반환한다.
false 를 반환한다.
FunctionDeclaration
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
FunctionExpression
:
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
GeneratorDeclaration
:
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
GeneratorExpression
:
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorDeclaration
:
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression
:
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionDeclaration
:
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
AsyncFunctionExpression
:
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
false 를 반환한다.
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
get
ClassElementName
(
)
{
FunctionBody
}
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
AsyncGeneratorMethod
:
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
ClassElementName 의
ContainsArguments 를
반환한다.
15.7.10 실행 시 의미론: ClassFieldDefinitionEvaluation
구문 지향 연산
ClassFieldDefinitionEvaluation은 homeObject (객체)를 인자로 받고,
내포된 normal completion 에서
ClassFieldDefinition
Record 를 반환하거나,
abrupt completion 을
반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
FieldDefinition :
ClassElementName
Initializer opt
name 을 ? Evaluation of ClassElementName 로 한다.
Initializer 가 존재하면,
formalParameterList 를 다음 생성식의 인스턴스로 한다:
FormalParameters
: [empty]
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행
컨텍스트 의 PrivateEnvironment로 한다.
sourceText 를 유니코드 코드 포인트의 빈 시퀀스로 한다.
initializer 를 OrdinaryFunctionCreate (%Function.prototype% ,
sourceText , formalParameterList , Initializer ,
non-lexical-this , env , privateEnv )로
한다.
MakeMethod (initializer ,
homeObject )를 수행한다.
initializer .[[ClassFieldInitializerName]] 를
name 으로 설정한다.
그렇지 않으면,
initializer 를 empty 로 한다.
ClassFieldDefinition
Record { [[Name]] : name , [[Initializer]] : initializer }를 반환한다.
참고
initializer 에 대해 생성된 함수는 ECMAScript 코드에서 직접 접근할 수 없습니다.
15.7.11 실행 시 의미론: ClassStaticBlockDefinitionEvaluation
구문 지향 연산
ClassStaticBlockDefinitionEvaluation은 homeObject (객체)를 인자로 받고,
ClassStaticBlockDefinition
Record 를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
ClassStaticBlock :
static
{
ClassStaticBlockBody
}
lex 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 유니코드 코드 포인트의 빈 시퀀스로 한다.
formalParameters 를 다음 생성식의 인스턴스로 한다:
FormalParameters
: [empty]
bodyFunction 을 OrdinaryFunctionCreate (%Function.prototype% ,
sourceText , formalParameters , ClassStaticBlockBody ,
non-lexical-this , lex , privateEnv )로 한다.
MakeMethod (bodyFunction ,
homeObject )를 수행한다.
ClassStaticBlockDefinition
Record { [[BodyFunction]] :
bodyFunction }을 반환한다.
참고
함수 bodyFunction 은 ECMAScript 코드에서 직접 접근할 수 없습니다.
15.7.12 실행 시 의미론: EvaluateClassStaticBlockBody
구문 지향 연산
EvaluateClassStaticBlockBody는 functionObject (ECMAScript 함수 객체 )를 인자로
받고,
return completion 또는
throw completion 을 반환합니다.
다음 생성식에 대해 개별적으로 정의됩니다:
ClassStaticBlockBody
: ClassStaticBlockStatementList
Assert :
functionObject 는 ClassStaticBlockDefinitionEvaluation
단계 5 에 의해 생성된 합성 함수이다.
! FunctionDeclarationInstantiation (functionObject ,
« »).를 수행한다.
? Evaluation of ClassStaticBlockStatementList 를
수행한다.
ReturnCompletion (undefined )를
반환한다.
15.7.13 실행 시 의미론: ClassElementEvaluation
구문 지향 연산
ClassElementEvaluation은 object (객체)를 인자로 받고,
내포된 normal completion 에서
ClassFieldDefinition
Record ,
ClassStaticBlockDefinition
Record ,
PrivateElement ,
또는 unused 를 반환하거나,
abrupt completion 을
반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
ClassElement :
FieldDefinition
;
static
FieldDefinition
;
? ClassFieldDefinitionEvaluation of FieldDefinition 에
object 인자를 넘겨 반환한다.
ClassElement :
MethodDefinition
static
MethodDefinition
? MethodDefinitionEvaluation of MethodDefinition 에
object 와 false 인자를 넘겨 반환한다.
ClassElement : ClassStaticBlock
ClassStaticBlockDefinitionEvaluation
of ClassStaticBlock 에 object
인자를 넘겨 반환한다.
ClassElement : ;
unused 를 반환한다.
15.7.14 실행 시 의미론: ClassDefinitionEvaluation
구문 지향 연산
ClassDefinitionEvaluation은 classBinding (문자열 또는 undefined )과
className (프로퍼티
키 또는 Private Name ) 인자를 받고,
내포된 normal completion 에서
함수
객체 를 반환하거나 abrupt
completion 을 반환합니다.
참고
명세의 편의를 위해, private 메서드와 접근자는 클래스 인스턴스의 [[PrivateElements]] 슬롯에
private 필드와 함께 포함되어 있습니다.
그러나 어떤 객체든 주어진 클래스에 의해 정의된 모든 private 메서드와 접근자를 가지거나, 아무것도 가지지 않습니다.
이 기능은 구현이 각 메서드 또는 접근자를 개별적으로 추적할 필요 없이, private 메서드와 접근자를 구현할 수 있도록 설계되었습니다.
예를 들어, 구현체는 인스턴스 private 메서드를 해당 Private Name 에 직접 연결하고,
각 객체에 대해 어떤 클래스 생성자 가 해당 객체를 this 값으로 실행했는지 추적할 수
있습니다.
객체에서 인스턴스 private 메서드를 조회하는 것은, 해당 메서드를 정의한 클래스 생성자 가 객체를 초기화했는지 확인하고,
Private
Name 에 연결된 메서드를 반환하는 것으로 구성됩니다.
이는 private 필드와는 다릅니다: 필드 이니셜라이저가 클래스 인스턴스화 중에 throw될 수 있기 때문에,
개별 객체는 주어진 클래스의 private 필드의 일부만 가질 수 있으므로, private 필드는 일반적으로 개별적으로 추적되어야 합니다.
다음 생성식에 대해 개별적으로 정의됩니다:
ClassTail :
ClassHeritage opt
{
ClassBody opt
}
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
classEnv 를 NewDeclarativeEnvironment (env )로
한다.
classBinding 이 undefined 가 아니면,
! classEnv .CreateImmutableBinding(classBinding ,
true )를 수행한다.
outerPrivateEnvironment 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
classPrivateEnvironment 를 NewPrivateEnvironment (outerPrivateEnvironment )로
한다.
ClassBody 가 존재하면,
ClassBody 의
PrivateBoundIdentifiers 의
각 문자열 dn 에 대해,
classPrivateEnvironment .[[Names]] 에
pn 이라는 Private Name 이 포함되어 있고,
pn .[[Description]] 이 dn 인
경우,
Assert : 이는 getter/setter
쌍에만 해당합니다.
그렇지 않으면,
name 을 dn 을 [[Description]] 으로 하는 새로운 Private Name 로
한다.
name 을 classPrivateEnvironment .[[Names]] 에 추가한다.
ClassHeritage 가 존재하지
않으면,
protoParent 를 %Object.prototype% 로
한다.
constructorParent 를 %Function.prototype% 로
한다.
그렇지 않으면,
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 classEnv 로 설정한다.
참고: 실행 중인 실행 컨텍스트 의
PrivateEnvironment는 ClassHeritage 평가 시
outerPrivateEnvironment 이다.
superclassRef 를 Completion (Evaluation of ClassHeritage )로
한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 env 로 설정한다.
superclass 를 ? GetValue (?
superclassRef )로 한다.
superclass 가 null 이면,
protoParent 를 null 로 한다.
constructorParent 를 %Function.prototype% 로
한다.
그렇지 않고 IsConstructor (superclass )
가 false 이면,
TypeError 예외를 throw한다.
그 밖의 경우,
protoParent 를 ? Get (superclass ,
"prototype" )로 한다.
protoParent 가 객체가 아니거나
null 이 아니라면, TypeError 예외를 throw한다.
constructorParent 를 superclass 로 한다.
proto 를 OrdinaryObjectCreate (protoParent )로
한다.
ClassBody 가 존재하지 않으면
constructor 를 empty 로 한다.
그 밖에는, constructor 를 ClassBody 의 ConstructorMethod 로
한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 classEnv 로 설정한다.
실행 중인 실행 컨텍스트 의
PrivateEnvironment를 classPrivateEnvironment 로 설정한다.
constructor 가 empty 이면,
defaultConstructor 를 아무 인자도 받지 않고, 캡처하지 않으며, 호출 시 다음 단계를 수행하는 새로운
Abstract Closure 로 한다:
args 를 이 함수에 [[Call]] 또는 [[Construct]] 로 전달된 인자의 List 로
한다.
NewTarget이 undefined 이면, TypeError
예외를 throw한다.
F 를 활성 함수 객체 로 한다.
F .[[ConstructorKind]] 가
derived 이면,
참고: 이 분기는 constructor(...args) { super(...args); }와
비슷하게 동작합니다. 가장 눈에 띄는 차이점은 위 ECMAScript 소스 텍스트가 %Symbol.iterator% 를
%Array.prototype%에서 호출하는 반면,
이 함수는 호출하지 않는다는 점입니다.
func 를 ! F .[[GetPrototypeOf]] ()로 한다.
IsConstructor (func )가
false 이면, TypeError 예외를
throw한다.
result 를 ? Construct (func ,
args , NewTarget)로 한다.
그 밖의 경우,
참고: 이 분기는 constructor() {}와 비슷하게 동작합니다.
result 를 ? OrdinaryCreateFromConstructor (NewTarget,
"%Object.prototype%" )로 한다.
? InitializeInstanceElements (result ,
F )를 수행한다.
NormalCompletion (result )를
반환한다.
F 를 CreateBuiltinFunction (defaultConstructor ,
0, className , « [[ConstructorKind]] , [[SourceText]] », 현재 Realm Record ,
constructorParent )로 한다.
그 밖의 경우,
constructorInfo 를 ! DefineMethod
of constructor 에 proto 와 constructorParent 인자를 넘겨
호출한 결과로 한다.
F 를 constructorInfo .[[Closure]] 로
한다.
MakeClassConstructor (F )를
수행한다.
SetFunctionName (F ,
className )을 수행한다.
MakeConstructor (F ,
false , proto )를 수행한다.
ClassHeritage 가 존재하면
F .[[ConstructorKind]] 를
derived 로 설정한다.
! DefineMethodProperty (proto ,
"constructor" , F , false )를 수행한다.
ClassBody 가 존재하지 않으면
elements 를 새로운 빈 List 로 한다.
그 밖에는, elements 를 ClassBody 의 NonConstructorElements 로
한다.
instancePrivateMethods 를 새로운 빈 List 로 한다.
staticPrivateMethods 를 새로운 빈 List 로 한다.
instanceFields 를 새로운 빈 List 로 한다.
staticElements 를 새로운 빈 List 로 한다.
elements 의 각 ClassElement e 에 대해,
IsStatic of
e 가 false 이면,
element 를 Completion (ClassElementEvaluation of
e 에 proto 인자를 넘겨 호출한 결과)로 한다.
그 밖에는,
element 를 Completion (ClassElementEvaluation of
e 에 F 인자를 넘겨 호출한 결과)로 한다.
element 가 abrupt
completion 이면,
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 env 로 설정한다.
실행 중인 실행 컨텍스트 의
PrivateEnvironment를
outerPrivateEnvironment 로 설정한다.
? element 를 반환한다.
element 를 ! element 로 설정한다.
element 가 PrivateElement 이면,
Assert : element .[[Kind]] 는 method 또는
accessor 이다.
IsStatic of
e 가 false 이면, container 를
instancePrivateMethods 로 한다.
그 밖에는 container 를 staticPrivateMethods 로 한다.
container 에 element .[[Key]] 와 동일한 pe 라는 PrivateElement 가
포함되어 있다면,
Assert :
element .[[Kind]] 와
pe .[[Kind]] 는 모두
accessor 이다.
element .[[Get]] 이
undefined 이면,
combined 를 PrivateElement
{ [[Key]] :
element .[[Key]] ,
[[Kind]] :
accessor , [[Get]] : pe .[[Get]] , [[Set]] : element .[[Set]] }로 한다.
그 밖에는,
combined 를 PrivateElement
{ [[Key]] :
element .[[Key]] ,
[[Kind]] :
accessor , [[Get]] : element .[[Get]] , [[Set]] : pe .[[Set]] }로 한다.
container 의 pe 를 combined 로 교체한다.
그 밖에는,
element 를 container 에 추가한다.
그 밖에 element 가 ClassFieldDefinition
Record 이면,
IsStatic of
e 가 false 이면, element 를
instanceFields 에 추가한다.
그 밖에는 element 를 staticElements 에 추가한다.
그 밖에 element 가 ClassStaticBlockDefinition
Record 이면,
element 를 staticElements 에 추가한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 env 로 설정한다.
classBinding 이 undefined 가 아니면,
! classEnv .InitializeBinding(classBinding ,
F )를 수행한다.
F .[[PrivateMethods]] 를
instancePrivateMethods 로 설정한다.
F .[[Fields]] 를 instanceFields 로 설정한다.
staticPrivateMethods 의 각 PrivateElement
method 에 대해,
! PrivateMethodOrAccessorAdd (F ,
method )를 수행한다.
staticElements 의 각 elementRecord 에 대해,
elementRecord 가 ClassFieldDefinition
Record 이면,
result 를 Completion (DefineField (F ,
elementRecord ))로 한다.
그 밖에는,
Assert : elementRecord 는
ClassStaticBlockDefinition
Record 이다.
result 를 Completion (Call (elementRecord .[[BodyFunction]] , F ))로 한다.
result 가 abrupt
completion 이면,
실행 중인 실행 컨텍스트 의
PrivateEnvironment를
outerPrivateEnvironment 로 설정한다.
? result 를 반환한다.
실행 중인 실행 컨텍스트 의
PrivateEnvironment를 outerPrivateEnvironment 로 설정한다.
F 를 반환한다.
15.7.15 실행 시 의미론: BindingClassDeclarationEvaluation
구문 지향 연산
BindingClassDeclarationEvaluation은 인자를 받지 않으며,
내포된 normal completion 에서
함수
객체 를 반환하거나 abrupt
completion 을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
ClassDeclaration :
class
BindingIdentifier
ClassTail
className 을 BindingIdentifier 의 StringValue 로 한다.
value 를 ? ClassDefinitionEvaluation of ClassTail 에
className 과 className 인자를 넘겨 호출한 결과로 한다.
value .[[SourceText]] 를 ClassDeclaration 에 매치된 소스
텍스트 로 설정한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
? InitializeBoundName (className ,
value , env )를 수행한다.
value 를 반환한다.
ClassDeclaration :
class
ClassTail
value 를 ? ClassDefinitionEvaluation of ClassTail 에
undefined 와 "default" 인자를 넘겨 호출한 결과로 한다.
value .[[SourceText]] 를 ClassDeclaration 에 매치된 소스
텍스트 로 설정한다.
value 를 반환한다.
참고
ClassDeclaration
:
class
ClassTail
은 ExportDeclaration 의 일부로만 나타나며, 바인딩의
생성은 해당 생성식의 평가 작업의 일부로 처리됩니다. 16.2.3.7 를 참조하세요.
15.7.16 실행 시 의미론: Evaluation
ClassDeclaration :
class
BindingIdentifier
ClassTail
? BindingClassDeclarationEvaluation of this
ClassDeclaration 를
수행한다.
empty 를 반환한다.
참고
ClassExpression :
class
ClassTail
value 를 ? ClassDefinitionEvaluation of ClassTail 에
undefined 와 "" 인자를 넘겨 호출한 결과로 한다.
value .[[SourceText]] 를 ClassExpression 에 매치된 소스
텍스트 로 설정한다.
value 를 반환한다.
ClassExpression :
class
BindingIdentifier
ClassTail
className 을 BindingIdentifier 의 StringValue 로 한다.
value 를 ? ClassDefinitionEvaluation of ClassTail 에
className 과 className 인자를 넘겨 호출한 결과로 한다.
value .[[SourceText]] 를 ClassExpression 에 매치된 소스
텍스트 로 설정한다.
value 를 반환한다.
ClassElementName :
PrivateIdentifier
privateIdentifier 를 PrivateIdentifier 의 StringValue 로 한다.
privateEnvRec 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
names 를 privateEnvRec .[[Names]] 로 한다.
Assert :
names 의 정확히 한 요소는 [[Description]] 이
privateIdentifier 인 Private Name 이다.
privateName 을 names 에서 [[Description]] 이
privateIdentifier 인 Private Name 로 한다.
privateName 을 반환한다.
ClassStaticBlockStatementList
: [empty]
undefined 를 반환한다.
15.8 비동기 함수 정의
구문
AsyncFunctionDeclaration [Yield,
Await, Default] :
async
[여기에는 LineTerminator 없음]
function
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
[+Default]
async
[여기에는 LineTerminator 없음]
function
(
FormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
AsyncFunctionExpression
:
async
[여기에는 LineTerminator 없음]
function
BindingIdentifier [~Yield,
+Await] opt
(
FormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
AsyncMethod [Yield,
Await] :
async
[여기에는 LineTerminator 없음]
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
AsyncFunctionBody :
FunctionBody [~Yield,
+Await]
AwaitExpression [Yield]
:
await
UnaryExpression [?Yield,
+Await]
참고 1
await는 [Await] 파라미터가 있을 때 AwaitExpression 의 키워드 로 파싱됩니다.
[Await] 파라미터는 다음 컨텍스트의 최상위에서 존재하지만, FunctionBody 등의 일부 컨텍스트에서는 비활성일 수 있습니다:
Script 가 구문적 목표
기호 일 때, [Await] 파라미터가 없으면 await는 식별자로 파싱될 수
있습니다. 다음과 같은 컨텍스트를 포함합니다:
참고 2
YieldExpression 과 달리,
AwaitExpression 의 피연산자를
생략하면 문법 오류입니다. 반드시 await할 대상이 필요합니다.
15.8.1 정적 의미론: 초기 오류
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
AsyncFunctionDeclaration
:
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
AsyncFunctionExpression
:
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
15.8.2 실행 시 의미론: InstantiateAsyncFunctionObject
구문 지향 연산
InstantiateAsyncFunctionObject는 env (Environment Record )와
privateEnv (PrivateEnvironment Record 또는
null ) 인자를 받고, ECMAScript 함수 객체 를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
AsyncFunctionDeclaration
:
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
name 을 BindingIdentifier 의 StringValue 로 한다.
sourceText 를 AsyncFunctionDeclaration 에 매치된
소스
텍스트 로 한다.
F 를 OrdinaryFunctionCreate (%AsyncFunction.prototype% ,
sourceText , FormalParameters , AsyncFunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (F ,
name )을 수행한다.
F 를 반환한다.
AsyncFunctionDeclaration
:
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
sourceText 를 AsyncFunctionDeclaration 에 매치된
소스
텍스트 로 한다.
F 를 OrdinaryFunctionCreate (%AsyncFunction.prototype% ,
sourceText , FormalParameters , AsyncFunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (F ,
"default" )를 수행한다.
F 를 반환한다.
15.8.3 실행 시 의미론: InstantiateAsyncFunctionExpression
구문 지향 연산
InstantiateAsyncFunctionExpression은 선택적 인자 name (프로퍼티 키 또는 Private
Name )를 받고,
ECMAScript 함수
객체 를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
AsyncFunctionExpression
:
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
name 이 존재하지 않으면 name 을 "" 로 설정한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 AsyncFunctionExpression에
매치된 소스 텍스트 로 한다.
closure 를 OrdinaryFunctionCreate (%AsyncFunction.prototype% ,
sourceText , FormalParameters , AsyncFunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (closure ,
name )을 수행한다.
closure 를 반환한다.
AsyncFunctionExpression
:
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
Assert :
name 이 존재하지 않는다.
name 을 BindingIdentifier 의 StringValue 로 설정한다.
outerEnv 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
funcEnv 를 NewDeclarativeEnvironment (outerEnv )로
한다.
! funcEnv .CreateImmutableBinding(name ,
false )을 수행한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 AsyncFunctionExpression에
매치된 소스 텍스트 로 한다.
closure 를 OrdinaryFunctionCreate (%AsyncFunction.prototype% ,
sourceText , FormalParameters , AsyncFunctionBody ,
non-lexical-this , funcEnv , privateEnv )로 한다.
SetFunctionName (closure ,
name )을 수행한다.
! funcEnv .InitializeBinding(name ,
closure )을 수행한다.
closure 를 반환한다.
참고
15.8.4 실행 시 의미론: EvaluateAsyncFunctionBody
구문 지향 연산
EvaluateAsyncFunctionBody는 functionObject (ECMAScript 함수 객체 )와
argumentsList (List 타입의
ECMAScript 언어 값 목록) 인자를 받고,
return completion 을
반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
AsyncFunctionBody
: FunctionBody
promiseCapability 를 ! NewPromiseCapability (%Promise% )로 한다.
completion 을 Completion (FunctionDeclarationInstantiation (functionObject ,
argumentsList ))로 한다.
completion 이 abrupt
completion 이면,
! Call (promiseCapability .[[Reject]] , undefined , «
completion .[[Value]] »)를 수행한다.
그 밖에는,
AsyncFunctionStart (promiseCapability ,
FunctionBody )를
수행한다.
ReturnCompletion (promiseCapability .[[Promise]] )를 반환한다.
15.8.5 실행 시 의미론: Evaluation
AsyncFunctionExpression
:
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
InstantiateAsyncFunctionExpression
of AsyncFunctionExpression 를 반환한다.
AwaitExpression :
await
UnaryExpression
exprRef 를 ? Evaluation of UnaryExpression 로 한다.
value 를 ? GetValue (exprRef )로 한다.
? Await (value )를 반환한다.
15.9 비동기 화살표 함수 정의
구문
AsyncArrowFunction [In, Yield,
Await] :
async
[여기에는 LineTerminator 없음]
AsyncArrowBindingIdentifier [?Yield]
[여기에는 LineTerminator 없음]
=>
AsyncConciseBody [?In]
CoverCallExpressionAndAsyncArrowHead [?Yield,
?Await]
[여기에는 LineTerminator 없음]
=>
AsyncConciseBody [?In]
AsyncConciseBody [In]
:
[lookahead ≠ { ]
ExpressionBody [?In,
+Await]
{
AsyncFunctionBody
}
AsyncArrowBindingIdentifier [Yield]
:
BindingIdentifier [?Yield,
+Await]
CoverCallExpressionAndAsyncArrowHead [Yield,
Await] :
MemberExpression [?Yield,
?Await]
Arguments [?Yield,
?Await]
보충 구문
다음 생성식의 인스턴스를 처리할 때
AsyncArrowFunction
:
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead 의
해석은 다음 문법을 사용하여 정제됩니다:
AsyncArrowHead :
async
[여기에는 LineTerminator 없음]
ArrowFormalParameters [~Yield,
+Await]
15.9.1 정적 의미론: 초기 오류
AsyncArrowFunction
:
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
AsyncArrowFunction
:
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
15.9.2 정적 의미론: AsyncConciseBodyContainsUseStrict
구문 지향 연산
AsyncConciseBodyContainsUseStrict는 인자를 받지 않으며, Boolean을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
AsyncConciseBody :
ExpressionBody
false 를 반환한다.
AsyncConciseBody :
{
AsyncFunctionBody
}
AsyncFunctionBody 의 FunctionBodyContainsUseStrict 를
반환한다.
15.9.3 실행 시 의미론: EvaluateAsyncConciseBody
구문 지향 연산
EvaluateAsyncConciseBody는 functionObject (ECMAScript 함수 객체 )와
argumentsList (List 타입의
ECMAScript 언어 값 목록) 인자를 받고,
return completion 을
반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
AsyncConciseBody :
ExpressionBody
promiseCapability 를 ! NewPromiseCapability (%Promise% )로 한다.
completion 을 Completion (FunctionDeclarationInstantiation (functionObject ,
argumentsList ))로 한다.
completion 이 abrupt
completion 이면,
! Call (promiseCapability .[[Reject]] , undefined , «
completion .[[Value]] »)를 수행한다.
그 밖에는,
AsyncFunctionStart (promiseCapability ,
ExpressionBody )를 수행한다.
ReturnCompletion (promiseCapability .[[Promise]] )를 반환한다.
15.9.4 실행 시 의미론: InstantiateAsyncArrowFunctionExpression
구문 지향 연산
InstantiateAsyncArrowFunctionExpression은 선택적 인자 name (프로퍼티 키 또는 Private
Name )를 받고,
ECMAScript 함수
객체 를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
AsyncArrowFunction
:
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
name 이 존재하지 않으면 name 을 "" 로 설정한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 AsyncArrowFunction에
매치된 소스 텍스트 로 한다.
parameters 를 AsyncArrowBindingIdentifier 로
한다.
closure 를 OrdinaryFunctionCreate (%AsyncFunction.prototype% ,
sourceText , parameters , AsyncConciseBody ,
lexical-this , env , privateEnv )로 한다.
SetFunctionName (closure ,
name )을 수행한다.
closure 를 반환한다.
AsyncArrowFunction
:
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
name 이 존재하지 않으면 name 을 "" 로 설정한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 AsyncArrowFunction에
매치된 소스 텍스트 로 한다.
head 를 AsyncArrowHead 로 한다. 이는 CoverCallExpressionAndAsyncArrowHead 에
의해 덮여진 것이다.
parameters 를 head 의 ArrowFormalParameters 로 한다.
closure 를 OrdinaryFunctionCreate (%AsyncFunction.prototype% ,
sourceText , parameters , AsyncConciseBody ,
lexical-this , env , privateEnv )로 한다.
SetFunctionName (closure ,
name )을 수행한다.
closure 를 반환한다.
15.9.5 실행 시 의미론: 평가
AsyncArrowFunction
:
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
InstantiateAsyncArrowFunctionExpression
of AsyncArrowFunction 를 반환한다.
15.10 꼬리 위치 호출
15.10.1 정적 의미: IsInTailPosition ( call )
추상 연산 IsInTailPosition은 call ( CallExpression 구문
노드 , MemberExpression 구문
노드 , 또는 OptionalChain 구문
노드 )를 인수로 받아 Boolean을 반환합니다. 호출 시 다음 단계를 수행합니다:
IsStrict (call )이
false 이면, false 를 반환합니다.
call 이 FunctionBody , ConciseBody , 또는 AsyncConciseBody 에 포함되어 있지 않으면,
false 를 반환합니다.
body 를 FunctionBody , ConciseBody , 또는 AsyncConciseBody 중 call 을
가장 밀접하게 포함하는 것으로 설정합니다.
body 가 FunctionBody 의 GeneratorBody 라면,
false 를 반환합니다.
body 가 FunctionBody 의 AsyncFunctionBody 라면,
false 를 반환합니다.
body 가 FunctionBody 의 AsyncGeneratorBody 라면,
false 를 반환합니다.
body 가 AsyncConciseBody 라면,
false 를 반환합니다.
body 와 인수 call 로 HasCallInTailPosition 의
결과를 반환합니다.
참고
꼬리 위치 호출은 엄격 모드 코드 에서만 정의됩니다. 이는 호출자 컨텍스트 체인의
관찰을 가능하게 하는 일반적인 비표준 언어 확장(10.2.4 )
때문입니다.
15.10.2 정적 의미: HasCallInTailPosition
구문-지향 연산
HasCallInTailPosition은 call ( CallExpression 구문
노드 , MemberExpression 구문
노드 , 또는 OptionalChain 구문
노드 )를 인수로 받아 Boolean을 반환합니다.
참고 1
call 은 특정 소스 텍스트 범위를 나타내는 구문 노드 입니다. 아래 알고리즘이
call 을 다른 구문 노드 와 비교할 때, 이는 동일한 소스 텍스트를 나타내는지
테스트하는 것입니다.
참고 2
반환 GetValue 결과가 즉시 뒤따르는 잠재적 꼬리 위치 호출도 꼬리 위치 호출이
될 수 있습니다. 함수 호출은 참조
레코드 를 반환할 수 없으므로, 이러한 GetValue 연산은 항상 실제 함수 호출 결과와 동일한 값을 반환합니다.
다음 생성 규칙에 따라 개별적으로 정의됩니다:
StatementList :
StatementList
StatementListItem
has 를 HasCallInTailPosition 의
StatementList 와 인수
call 의 결과로 설정한다.
has 가 true 이면, true 를 반환한다.
HasCallInTailPosition 의
StatementListItem 와 인수
call 의 결과를 반환한다.
FunctionStatementList
:
[empty]
StatementListItem
:
Declaration
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ThrowStatement
DebuggerStatement
Block :
{
}
ReturnStatement :
return
;
LabelledItem :
FunctionDeclaration
ForInOfStatement :
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
CaseBlock :
{
}
false 를 반환한다.
IfStatement :
if
(
Expression
)
Statement
else
Statement
has 를 첫 번째 Statement 와 인수 call 로 HasCallInTailPosition 의
결과로 설정한다.
has 가 true 이면, true 를 반환한다.
두 번째 Statement 와 인수
call 로 HasCallInTailPosition 의
결과를 반환한다.
IfStatement :
if
(
Expression
)
Statement
DoWhileStatement :
do
Statement
while
(
Expression
)
;
WhileStatement :
while
(
Expression
)
Statement
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
ForInOfStatement :
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
var
ForBinding
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
WithStatement :
with
(
Expression
)
Statement
HasCallInTailPosition 의
Statement 와 인수
call 의 결과를 반환한다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
HasCallInTailPosition 의
LabelledItem 와 인수
call 의 결과를 반환한다.
ReturnStatement :
return
Expression
;
HasCallInTailPosition 의
Expression 와 인수
call 의 결과를 반환한다.
SwitchStatement :
switch
(
Expression
)
CaseBlock
HasCallInTailPosition 의
CaseBlock 와 인수
call 의 결과를 반환한다.
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
has 를 false 로 설정한다.
첫 번째 CaseClauses 가 존재하면,
has 를 첫 번째 CaseClauses 와 인수 call 로 HasCallInTailPosition 의
결과로 설정한다.
has 가 true 이면, true 를 반환한다.
has 를 DefaultClause 와 인수 call 로
HasCallInTailPosition 의
결과로 설정한다.
has 가 true 이면, true 를 반환한다.
두 번째 CaseClauses 가 존재하면,
has 를 두 번째 CaseClauses 와 인수 call 로 HasCallInTailPosition 의
결과로 설정한다.
has 를 반환한다.
CaseClauses :
CaseClauses
CaseClause
has 를 CaseClauses 와 인수 call 로 HasCallInTailPosition 의
결과로 설정한다.
has 가 true 이면, true 를 반환한다.
CaseClause 와 인수
call 로 HasCallInTailPosition 의
결과를 반환한다.
CaseClause :
case
Expression
:
StatementList opt
DefaultClause :
default
:
StatementList opt
StatementList 가 존재하면,
HasCallInTailPosition 의
StatementList 와 인수
call 의 결과를 반환한다.
false 를 반환한다.
TryStatement :
try
Block
Catch
HasCallInTailPosition 의
Catch 와 인수 call 의
결과를 반환한다.
TryStatement :
try
Block
Finally
try
Block
Catch
Finally
HasCallInTailPosition 의
Finally 와 인수
call 의 결과를 반환한다.
Catch :
catch
(
CatchParameter
)
Block
HasCallInTailPosition 의
Block 와 인수 call 의
결과를 반환한다.
AssignmentExpression
:
YieldExpression
ArrowFunction
AsyncArrowFunction
LeftHandSideExpression
=
AssignmentExpression
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
LeftHandSideExpression
&&=
AssignmentExpression
LeftHandSideExpression
||=
AssignmentExpression
LeftHandSideExpression
??=
AssignmentExpression
BitwiseANDExpression
:
BitwiseANDExpression
&
EqualityExpression
BitwiseXORExpression
:
BitwiseXORExpression
^
BitwiseANDExpression
BitwiseORExpression
:
BitwiseORExpression
|
BitwiseXORExpression
EqualityExpression
:
EqualityExpression
==
RelationalExpression
EqualityExpression
!=
RelationalExpression
EqualityExpression
===
RelationalExpression
EqualityExpression
!==
RelationalExpression
RelationalExpression
:
RelationalExpression
<
ShiftExpression
RelationalExpression
>
ShiftExpression
RelationalExpression
<=
ShiftExpression
RelationalExpression
>=
ShiftExpression
RelationalExpression
instanceof
ShiftExpression
RelationalExpression
in
ShiftExpression
PrivateIdentifier
in
ShiftExpression
ShiftExpression :
ShiftExpression
<<
AdditiveExpression
ShiftExpression
>>
AdditiveExpression
ShiftExpression
>>>
AdditiveExpression
AdditiveExpression
:
AdditiveExpression
+
MultiplicativeExpression
AdditiveExpression
-
MultiplicativeExpression
MultiplicativeExpression
:
MultiplicativeExpression
MultiplicativeOperator
ExponentiationExpression
ExponentiationExpression
:
UpdateExpression
**
ExponentiationExpression
UpdateExpression :
LeftHandSideExpression
++
LeftHandSideExpression
--
++
UnaryExpression
--
UnaryExpression
UnaryExpression :
delete
UnaryExpression
void
UnaryExpression
typeof
UnaryExpression
+
UnaryExpression
-
UnaryExpression
~
UnaryExpression
!
UnaryExpression
AwaitExpression
CallExpression :
SuperCall
ImportCall
CallExpression
[
Expression
]
CallExpression
.
IdentifierName
CallExpression
.
PrivateIdentifier
NewExpression :
new
NewExpression
MemberExpression :
MemberExpression
[
Expression
]
MemberExpression
.
IdentifierName
SuperProperty
MetaProperty
new
MemberExpression
Arguments
MemberExpression
.
PrivateIdentifier
PrimaryExpression
:
this
IdentifierReference
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
false 를 반환한다.
Expression :
AssignmentExpression
Expression
,
AssignmentExpression
HasCallInTailPosition 의
AssignmentExpression 와 인수
call 의 결과를 반환한다.
ConditionalExpression
:
ShortCircuitExpression
?
AssignmentExpression
:
AssignmentExpression
has 를 첫 번째 AssignmentExpression 와 인수
call 로 HasCallInTailPosition 의
결과로 설정한다.
has 가 true 이면, true 를 반환한다.
두 번째 AssignmentExpression 와 인수
call 로 HasCallInTailPosition 의
결과를 반환한다.
LogicalANDExpression
:
LogicalANDExpression
&&
BitwiseORExpression
HasCallInTailPosition 의
BitwiseORExpression 와 인수
call 의 결과를 반환한다.
LogicalORExpression
:
LogicalORExpression
||
LogicalANDExpression
HasCallInTailPosition 의
LogicalANDExpression 와 인수
call 의 결과를 반환한다.
CoalesceExpression
:
CoalesceExpressionHead
??
BitwiseORExpression
HasCallInTailPosition 의
BitwiseORExpression 와 인수
call 의 결과를 반환한다.
CallExpression :
CoverCallExpressionAndAsyncArrowHead
CallExpression
Arguments
CallExpression
TemplateLiteral
이 CallExpression 이
call 이면, true 를 반환한다.
false 를 반환한다.
OptionalExpression
:
MemberExpression
OptionalChain
CallExpression
OptionalChain
OptionalExpression
OptionalChain
HasCallInTailPosition 의
OptionalChain 와 인수
call 의 결과를 반환한다.
OptionalChain :
?.
[
Expression
]
?.
IdentifierName
?.
PrivateIdentifier
OptionalChain
[
Expression
]
OptionalChain
.
IdentifierName
OptionalChain
.
PrivateIdentifier
false 를 반환한다.
OptionalChain :
?.
Arguments
OptionalChain
Arguments
이 OptionalChain 이
call 이면, true 를 반환한다.
false 를 반환한다.
MemberExpression :
MemberExpression
TemplateLiteral
이 MemberExpression 이 call 이면,
true 를 반환한다.
false 를 반환한다.
PrimaryExpression
: CoverParenthesizedExpressionAndArrowParameterList
expr 를 ParenthesizedExpression 에서
covered 된 CoverParenthesizedExpressionAndArrowParameterList 로
설정한다.
HasCallInTailPosition 의
expr 와 인수 call 의 결과를 반환한다.
ParenthesizedExpression
:
(
Expression
)
HasCallInTailPosition 의
Expression 와 인수
call 의 결과를 반환한다.
15.10.3 PrepareForTailCall ( )
추상 연산 PrepareForTailCall은 인수를 받지 않으며 unused 를 반환한다. 호출 시 다음 단계를 수행한다:
Assert : 현재
execution context 는 이후 ECMAScript
코드 또는 내장 함수의 평가에 사용되지 않는다.
이 추상 연산 호출 이후의 Call 호출은 그러한 평가를 수행하기 전에 새로운 execution context 를
생성하고 푸시한다.
현재 execution context 와 연관된 모든 리소스를
폐기한다.
unused 를 반환한다.
꼬리 위치 호출은 대상 함수를 호출하기 전에 현재 실행 중인 함수의 execution context 와 연관된 임시 내부 리소스를 해제하거나,
그 리소스를 대상 함수 지원에 재사용해야 한다.
참고
예를 들어, 꼬리 위치 호출은 구현의 activation record 스택을 대상 함수의 activation record 크기가 호출 함수의 activation
record 크기를 초과하는 만큼만 증가시켜야 한다.
만약 대상 함수의 activation record가 더 작다면 전체 스택 크기는 줄어야 한다.
16 ECMAScript 언어: 스크립트와 모듈
16.1 스크립트
구문
Script :
ScriptBody opt
ScriptBody :
StatementList [~Yield, ~Await,
~Return]
16.1.1 정적 의미: 초기 에러
Script : ScriptBody
ScriptBody : StatementList
16.1.2 정적 의미: ScriptIsStrict
구문-지향 연산
ScriptIsStrict는 인수를 받지 않으며 Boolean을 반환한다. 다음 생성 규칙에 따라 개별적으로 정의된다:
Script : ScriptBody opt
ScriptBody 가 존재하고
Directive Prologue 가 Use
Strict Directive 를 포함하면 true 를 반환하고, 그렇지 않으면
false 를 반환한다.
16.1.3 실행 의미: 평가
Script : [empty]
undefined 를 반환한다.
16.1.4 스크립트 레코드
스크립트 레코드 는 평가 중인 스크립트에 대한
정보를 캡슐화한다. 각 스크립트 레코드는 표 39 에 나열된 필드를 포함한다.
표 39: 스크립트 레코드 필드
16.1.5 ParseScript ( sourceText , realm ,
hostDefined )
추상 연산 ParseScript는 sourceText (ECMAScript 소스 텍스트 ), realm (Realm 레코드 ),
hostDefined (아무 값) 인자를 받아 스크립트 레코드 또는 List (비어있지 않은
SyntaxError 객체 목록)을 반환한다. sourceText 를 Script 로 파싱한 결과에 기반하여 스크립트 레코드 를 생성한다. 호출 시 다음 단계를 수행한다:
script 를 ParseText (sourceText , Script )로 설정한다.
script 가 에러의 List 라면
script 를 반환한다.
스크립트
레코드 { [[Realm]] : realm ,
[[ECMAScriptCode]] : script , [[LoadedModules]] : « », [[HostDefined]] : hostDefined }를 반환한다.
참고
구현체는 ParseScript가 실제로 해당 소스 텍스트에 대해 수행되기 전에 스크립트 소스 텍스트를 파싱하고 초기 에러 조건을 분석할 수 있다. 하지만 에러
보고는 이 명세가 해당 소스 텍스트에 대해 실제로 ParseScript를 수행하는 시점까지 지연되어야 한다.
16.1.6 ScriptEvaluation ( scriptRecord )
추상 연산 ScriptEvaluation은 scriptRecord (스크립트 레코드 )를 인자로 받아 정상 완료(normal completion)
(내부에 ECMAScript 언어 값 를 포함) 또는 비정상 완료(abrupt
completion) 를 반환한다. 호출 시 다음 단계를 수행한다:
globalEnv 를 scriptRecord .[[Realm]] .[[GlobalEnv]] 로 설정한다.
scriptContext 를 새로운 ECMAScript 코드 실행
컨텍스트 로 설정한다.
scriptContext 의 Function을 null 로 설정한다.
scriptContext 의 Realm 을 scriptRecord .[[Realm]] 으로 설정한다.
scriptContext 의 ScriptOrModule을 scriptRecord 로 설정한다.
scriptContext 의 VariableEnvironment를 globalEnv 로 설정한다.
scriptContext 의 LexicalEnvironment를 globalEnv 로 설정한다.
scriptContext 의 PrivateEnvironment를 null 로 설정한다.
실행 중인 실행 컨텍스트 를 일시 중지한다.
scriptContext 를 실행 컨텍스트 스택 에 푸시한다;
scriptContext 가 이제 실행 중인 실행 컨텍스트 가
된다.
script 를 scriptRecord .[[ECMAScriptCode]] 로
설정한다.
result 를 Completion (GlobalDeclarationInstantiation (script ,
globalEnv ))로 설정한다.
result 가 정상 완료(normal
completion) 이면,
result 를 Completion (Evaluation of script )로
설정한다.
result 가 정상
완료(normal completion) 이고 result .[[Value]] 가 empty 이면,
result 를 NormalCompletion (undefined )로
설정한다.
scriptContext 를 일시 중지하고 실행 컨텍스트 스택 에서 제거한다.
Assert :
실행 컨텍스트 스택 는 비어 있지 않다.
실행 컨텍스트 스택 의 최상단에 있는 컨텍스트를
실행 중인 실행 컨텍스트 로 복구한다.
? result 를 반환한다.
16.1.7 GlobalDeclarationInstantiation ( script ,
env )
추상 연산 GlobalDeclarationInstantiation은 script (Script 구문 노드 )와 env
(글로벌 환경 레코드 )를 인자로 받으며, 정상 완료(normal completion)
(unused 포함) 또는 throw
completion 를 반환한다.
script 는 execution context 가 설정되는 Script 이며,
env 는 바인딩이 생성될 글로벌 환경이다.
참고 1
스크립트 평가를 위해 execution context 가 설정될 때, 선언은 현재
글로벌 환경에 인스턴스화된다.
코드에 선언된 각 글로벌 바인딩이 인스턴스화된다.
호출 시 다음 단계를 수행한다:
lexNames 를 script 의 LexicallyDeclaredNames 로
설정한다.
varNames 를 script 의 VarDeclaredNames 로
설정한다.
lexNames 의 각 요소 name 에 대해,
HasLexicalDeclaration (env ,
name )가 true 이면 SyntaxError 예외를
throw한다.
hasRestrictedGlobal 를 ? HasRestrictedGlobalProperty (env ,
name )로 설정한다.
참고: 글로벌 var 및 function 바인딩(비엄격 직접
eval 에서 도입된 것을 제외)은 non-configurable이므로 restricted global
properties이다.
hasRestrictedGlobal 가 true 이면
SyntaxError 예외를 throw한다.
varNames 의 각 요소 name 에 대해,
HasLexicalDeclaration (env ,
name )가 true 이면 SyntaxError 예외를
throw한다.
varDeclarations 를 script 의 VarScopedDeclarations 로
설정한다.
functionsToInitialize 를 새로운 빈 List 로 설정한다.
declaredFunctionNames 를 새로운 빈 List 로 설정한다.
varDeclarations 의 각 요소 d 에 대해, 역순 List 순서로,
d 가 VariableDeclaration ,
ForBinding ,
BindingIdentifier 모두가 아니라면,
Assert : d 는 FunctionDeclaration ,
GeneratorDeclaration ,
AsyncFunctionDeclaration ,
AsyncGeneratorDeclaration
중 하나이다.
참고: 동일 이름의 함수 선언이 여러 개면 마지막 선언이 사용된다.
fn 을 d 의 BoundNames 의
단일 요소로 설정한다.
declaredFunctionNames 가 fn 을 포함하지 않으면,
fnDefinable 을 ? CanDeclareGlobalFunction (env ,
fn )로 설정한다.
fnDefinable 이 false 이면
TypeError 예외를 throw한다.
fn 을 declaredFunctionNames 에 추가한다.
d 를 functionsToInitialize 의 첫 번째 요소로 삽입한다.
declaredVarNames 를 새로운 빈 List 로 설정한다.
varDeclarations 의 각 요소 d 에 대해,
d 가 VariableDeclaration ,
ForBinding ,
BindingIdentifier 중 하나라면,
d 의 BoundNames 의
각 문자열 vn 에 대해,
declaredFunctionNames 가 vn 을 포함하지 않으면,
vnDefinable 을 ? CanDeclareGlobalVar (env ,
vn )로 설정한다.
vnDefinable 이 false 이면
TypeError 예외를 throw한다.
declaredVarNames 가 vn 을 포함하지 않으면,
vn 을 declaredVarNames 에
추가한다.
참고: global object 가 ordinary
object 이면 이 알고리즘 단계 이후 비정상 종료가 발생하지 않는다. 하지만 global
object 가 Proxy exotic object 라면 이후 단계에서 비정상 종료를
유발할 수 있다.
참고: 부록 B.3.2.2 에서 이
지점에 추가 단계를 삽입한다.
lexDeclarations 를 script 의 LexicallyScopedDeclarations 로
설정한다.
privateEnv 를 null 로 설정한다.
lexDeclarations 의 각 요소 d 에 대해,
참고: 렉시컬 선언 이름은 여기서 인스턴스화만 되고 초기화는 되지 않는다.
d 의 BoundNames 의 각 요소
dn 에 대해,
IsConstantDeclaration (d )가
true 이면,
? env .CreateImmutableBinding (dn ,
true )를 수행한다.
그 외에는,
? env .CreateMutableBinding (dn ,
false )를 수행한다.
functionsToInitialize 의 각 구문 노드 f 에
대해,
fn 을 f 의 BoundNames 의 단일
요소로 설정한다.
fo 를 f 에 대해 InstantiateFunctionObject 를
env 와 privateEnv 인자로 호출한 결과로 설정한다.
? CreateGlobalFunctionBinding (env ,
fn , fo , false )를 수행한다.
declaredVarNames 의 각 문자열 vn 에 대해,
? CreateGlobalVarBinding (env ,
vn , false )를 수행한다.
unused 를 반환한다.
참고 2
초기 에러 는
16.1.1 에서 함수/var
선언과 let/const/class 선언 간의 이름 충돌 및 단일 Script 내에서의 let/const/class 바인딩 재선언을 방지한다. 그러나
여러 Script 에 걸친 충돌 및 재선언은
GlobalDeclarationInstantiation 실행 중 런타임 에러로 감지된다. 이러한 에러가 감지되면 스크립트에 대해 어떤 바인딩도 인스턴스화되지
않는다. 하지만 global object 가 Proxy
exotic object 로 정의된 경우, 런타임 충돌 선언 검사가 신뢰할 수 없어 비정상 완료(abrupt
completion) 와 일부 글로벌 선언이 인스턴스화되지 않을 수 있다.
이 경우 Script 의 코드는 평가되지 않는다.
명시적인 var 또는 function 선언과 달리, global object 에 직접 생성된 프로퍼티는
let/const/class 선언에 의해 그림자 처리될 수 있다.
16.2 모듈
구문
Module :
ModuleBody opt
ModuleBody :
ModuleItemList
ModuleItemList :
ModuleItem
ModuleItemList
ModuleItem
ModuleItem :
ImportDeclaration
ExportDeclaration
StatementListItem [~Yield,
+Await, ~Return]
ModuleExportName :
IdentifierName
StringLiteral
16.2.1 모듈 의미론
16.2.1.1 정적 의미: 초기 에러
ModuleBody : ModuleItemList
참고
중복 ExportedNames 규칙은
하나의 ModuleBody 내에 여러
export default ExportDeclaration 항목이 있으면 구문
에러임을 의미한다. 충돌 또는 중복 선언과 관련된 추가 에러 조건은 Module 의 평가 이전, 모듈 연결 단계에서 검사된다. 이러한 에러가
감지되면 Module 는 평가되지 않는다.
ModuleExportName
: StringLiteral
16.2.1.2 정적 의미: ImportedLocalNames(
importEntries
)
추상 연산 ImportedLocalNames는 importEntries (List of ImportEntry
Record )를 인자로 받고, 문자열 List 를 반환한다.
importEntries 로 정의된 모든 지역 이름 바인딩의 List 를 생성한다. 호출 시 다음
단계를 수행한다:
localNames 를 새로운 빈 List 로 설정한다.
importEntries 의 각 ImportEntry Record i 에
대해,
i .[[LocalName]] 을 localNames 에
추가한다.
localNames 를 반환한다.
16.2.1.3 ModuleRequest 레코드
ModuleRequest
Record 는 주어진 import 속성으로 모듈을 import하기 위한 요청을 나타낸다. 다음 필드로 구성된다:
표 40: ModuleRequest Record 필드
LoadedModuleRequest Record 는 모듈 import 요청과 결과 Module Record 를 함께 나타낸다. 표
40 에 정의된 필드에 [[Module]] 이 추가된다:
표 41: LoadedModuleRequest Record
필드
ImportAttribute Record 는 다음 필드로 구성된다:
표 42: ImportAttribute Record 필드
필드 이름
값 타입
의미
[[Key]]
문자열
속성 key
[[Value]]
문자열
속성 value
16.2.1.3.1 ModuleRequestsEqual ( left ,
right )
추상 연산 ModuleRequestsEqual은 left (ModuleRequest Record
또는 LoadedModuleRequest Record )
와 right (ModuleRequest Record 또는 LoadedModuleRequest Record )
를 인자로 받고, Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
left .[[Specifier]] 가 right .[[Specifier]] 와 다르면 false 를 반환한다.
leftAttrs 를 left .[[Attributes]] 로
설정한다.
rightAttrs 를 right .[[Attributes]] 로
설정한다.
leftAttrsCount 를 leftAttrs 의 요소 개수로 설정한다.
rightAttrsCount 를 rightAttrs 의 요소 개수로 설정한다.
leftAttrsCount ≠ rightAttrsCount 이면
false 를 반환한다.
leftAttrs 의 각 ImportAttribute
Record l 에 대해,
rightAttrs 에 l .[[Key]] 와
l .[[Value]] 가 동일한 ImportAttribute
Record r 가 없으면
false 를 반환한다.
true 를 반환한다.
16.2.1.4 정적 의미: ModuleRequests
구문-지향 연산
ModuleRequests는 인수를 받지 않으며 List of
ModuleRequest Record 를 반환한다. 다음 생성 규칙에 따라
개별적으로 정의된다:
Module : [empty]
새로운 빈 List 를 반환한다.
ModuleItemList :
ModuleItem
ModuleItem 의
ModuleRequests 를
반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
requests 를 ModuleItemList 의 ModuleRequests 로
설정한다.
additionalRequests 를 ModuleItem 의 ModuleRequests 로
설정한다.
additionalRequests 의 각 ModuleRequest
Record mr 에 대해,
requests 에 ModuleRequest
Record mr2 가 없고, ModuleRequestsEqual (mr ,
mr2 )가 true 가 아니면,
mr 를 requests 에 추가한다.
requests 를 반환한다.
ModuleItem : StatementListItem
새로운 빈 List 를 반환한다.
ImportDeclaration
:
import
ImportClause
FromClause
;
specifier 를 FromClause 의 SV 로 설정한다.
유일한 요소가 ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : « » }인 List 를 반환한다.
ImportDeclaration
:
import
ImportClause
FromClause
WithClause
;
specifier 를 FromClause 의 SV 로 설정한다.
attributes 를 WithClause 의 WithClauseToAttributes 로
설정한다.
유일한 요소가 ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : attributes }인 List 를 반환한다.
ImportDeclaration
:
import
ModuleSpecifier
;
specifier 를 ModuleSpecifier 의 SV 로
설정한다.
유일한 요소가 ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : « » }인 List 를 반환한다.
ImportDeclaration
:
import
ModuleSpecifier
WithClause
;
specifier 를 ModuleSpecifier 의 SV 로
설정한다.
attributes 를 WithClause 의 WithClauseToAttributes 로
설정한다.
유일한 요소가 ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : attributes }인 List 를 반환한다.
ExportDeclaration
:
export
ExportFromClause
FromClause
;
specifier 를 FromClause 의 SV 로 설정한다.
유일한 요소가 ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : « » }인 List 를 반환한다.
ExportDeclaration
:
export
ExportFromClause
FromClause
WithClause
;
specifier 를 FromClause 의 SV 로 설정한다.
attributes 를 WithClause 의 WithClauseToAttributes 로
설정한다.
유일한 요소가 ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : attributes }인 List 를 반환한다.
ExportDeclaration
:
export
NamedExports
;
export
VariableStatement
export
Declaration
export
default
HoistableDeclaration
export
default
ClassDeclaration
export
default
AssignmentExpression
;
새로운 빈 List 를 반환한다.
16.2.1.5 추상 모듈 레코드
Module Record 는 단일 모듈의 import와 export에 대한
구조적 정보를 캡슐화한다. 이 정보는 연결된 모듈 집합의 import와 export를 연결하는 데 사용된다. Module Record는 모듈을 평가할 때만 사용하는
네 개의 필드를 포함한다.
명세 목적상 Module Record 값은 Record
명세 타입의 값이며, Module Record가 추상 클래스이고 추상 및 구체 서브클래스를 가진 단순 객체지향 계층에 존재한다고 생각할 수 있다. 이 명세서는
Cyclic
Module Record 라는 추상 서브클래스와 Source Text Module
Record 라는 구체 서브클래스를 정의한다. 다른 명세와 구현체들은 자신들이 정의한 대안적 모듈 정의 기능에 대응하는
추가적인 Module Record 서브클래스를 정의할 수 있다.
Module Record는 표 43 에 나열된 필드를 정의한다. 모든 Module
Definition 서브클래스는 최소한 이 필드들을 포함한다. 또한 Module Record는 표 44 에 나열된 추상 메서드 목록을
정의한다. 모든 Module Definition 서브클래스는 이 추상 메서드들의 구체 구현을 제공해야 한다.
표 43: Module Record 필드
표 44: Module Record 의 추상 메서드
메서드
목적
LoadRequestedModules([hostDefined ])
모듈을 연결할 수 있도록 모든 의존성을 재귀적으로 로드하며, 프라미스를 반환한다.
GetExportedNames([exportStarSet ])
이 모듈에서 직접 또는 간접적으로 export되는 모든 이름의 리스트를 반환한다.
이 메서드를 호출하기 전에 LoadRequestedModules가 성공적으로 완료되어야 한다.
ResolveExport(exportName [, resolveSet ])
이 모듈에서 export된 이름의 바인딩을 반환한다. 바인딩은 { [[Module]] : Module
Record , [[BindingName]] : String |
namespace } 형태의 ResolvedBinding Record 로 표현된다. 만약 export가 어떤
모듈에도 직접 바인딩되지 않은 Module Namespace Object라면 [[BindingName]] 은
namespace 로 설정된다. 이름을 해결할 수 없으면
null 을, 여러 바인딩이 발견되면
ambiguous 를 반환한다.
이 연산이 특정 exportName , resolveSet 쌍으로 호출될 때마다 같은
결과를 반환해야 한다.
이 메서드를 호출하기 전에 LoadRequestedModules가 성공적으로 완료되어야 한다.
Link()
모듈의 평가를 준비하기 위해 모든 모듈 의존성을 추이적으로 해결하고 Module Environment
Record 를 생성한다.
이 메서드를 호출하기 전에 LoadRequestedModules가 성공적으로 완료되어야 한다.
Evaluate()
이 모듈과 그 의존성의 평가에 대한 프라미스를 반환한다. 평가가 성공하거나 이미 성공적으로 평가된 경우 resolve되며,
평가 에러가 발생하거나 이미 실패한 경우 reject된다. 프라미스가 reject될 경우 호스트 는
프라미스 reject를 처리하고 평가 에러를 다시 throw해야 한다.
이 메서드를 호출하기 전에 Link가 성공적으로 완료되어야 한다.
16.2.1.5.1 EvaluateModuleSync ( module )
추상 연산 EvaluateModuleSync는 module (Module Record )를
인자로 받고, 정상 완료(normal
completion) (unused 포함) 또는 throw
completion 를 반환한다. 호출자는 module 의 평가가 이미 settle된 프라미스를
반환함을 보장해야 하며, module 을 동기적으로 평가한다. 호출 시 다음 단계를 수행한다:
Assert :
module 은 Cyclic Module Record 가 아니다.
promise 를 module .Evaluate()로 설정한다.
Assert :
promise .[[PromiseState]] 가
fulfilled 또는 rejected 이다.
promise .[[PromiseState]] 가
rejected 이면,
promise .[[PromiseIsHandled]] 이
false 이면, HostPromiseRejectionTracker (promise ,
"handle" )를 수행한다.
promise .[[PromiseIsHandled]] 을
true 로 설정한다.
ThrowCompletion (promise .[[PromiseResult]] )를 반환한다.
unused 를 반환한다.
16.2.1.6 순환 모듈 레코드
순환 모듈
레코드 는 Cyclic Module Record 타입의 다른 모듈들과의 의존성
사이클에 참여할 수 있는 모듈에 대한 정보를 나타내는 데 사용됩니다. Module Records 가
Cyclic
Module Record 타입의 하위 클래스가 아닌 경우 Source
Text Module Records 와의 의존성 사이클에 참여해서는 안 됩니다.
표 43 에 정의된 필드들 외에도 Cyclic
Module Records 는 표 45 에 나열된 추가 필드들을
가집니다.
표 45: 순환 모듈 레코드 의 추가 필드
필드 이름
값 타입
의미
[[Status]]
new , unlinked ,
linking , linked ,
evaluating ,
evaluating-async , 또는
evaluated
처음에는 new 입니다. 모듈의 생애 주기 동안
unlinked , linking ,
linked , evaluating , 경우에 따라
evaluating-async ,
evaluated 로(그 순서로) 전이됩니다.
evaluating-async 는 이 모듈이 비동기 의존성이 완료된 후 실행 대기 중이거나
[[HasTLA]] 필드가 true 인 모듈로서
실행되었고, 최상위 완료를 대기 중임을 나타냅니다.
[[EvaluationError]]
throw
completion 또는 empty
평가 중 발생한 예외를 나타내는 throw
completion 입니다. 예외가 발생하지 않았거나 [[Status]] 가 evaluated 가
아니면 undefined 입니다.
[[DFSAncestorIndex]]
integer 또는
empty
Link 및 Evaluate 중에만 사용하는 보조 필드입니다. [[Status]] 가
linking 또는 evaluating 일 때,
이 값은 모듈의 깊이 우선 탐색 인덱스이거나 동일한 강하게 연결된 구성 요소 내의 "이전" 모듈의 인덱스입니다.
[[RequestedModules]]
List
of ModuleRequest
Records
이 모듈의 import와 연관된 ModuleRequest
Records 의 List 입니다.
import의 소스 텍스트 발생 순서대로 리스트가 정렬됩니다.
[[LoadedModules]]
List
of LoadedModuleRequest
Records
이 레코드가 나타내는 모듈이 상대적 import 속성을 가지고 모듈을 import 요청할 때 사용한 specifier 문자열에서
Module
Record 로 매핑되는 정보입니다. 리스트에는 Records
r1 과 r2 가 존재하지 않습니다. ModuleRequestsEqual (r1 ,
r2 )가 true 인 경우.
[[CycleRoot]]
Cyclic Module Record
또는 empty
사이클 내에서 처음 방문한 모듈, 강하게 연결된 구성 요소의 루트 DFS 조상입니다. 사이클에 속하지 않은 모듈의 경우 자신이
됩니다. Evaluate가 완료된 후, 모듈의 [[DFSAncestorIndex]] 는
[[CycleRoot]] 의 깊이 우선 탐색 인덱스가 됩니다.
[[HasTLA]]
Boolean
이 모듈이 개별적으로 비동기적인지 여부(예: 최상위 await가 포함된 Source Text Module
Record 일 경우). 비동기 의존성이 있다고 해서 이 필드가
true 가 되는 것은 아닙니다. 이 필드는 모듈이 파싱된 이후에 변경되면 안 됩니다.
[[AsyncEvaluationOrder]]
unset , integer , 또는
done
이 필드는 처음에 unset 으로 설정되며, 완전히 동기적인 모듈의 경우 계속
unset 입니다. 모듈 자체가 비동기이거나 비동기 의존성을 가진 경우, integer 로 설정되어 16.2.1.6.1.3.4 에
의해 대기 중인 모듈 실행 순서를 결정합니다. 대기 모듈이 실행되면 done 으로
설정됩니다.
[[TopLevelCapability]]
PromiseCapability
Record 또는 empty
이 모듈이 어떤 사이클의 [[CycleRoot]] 이고, 그 사이클의 모듈 중 하나에
대해 Evaluate()가 호출된 경우, 이 필드는 전체 평가에 대한 PromiseCapability
Record 를 포함합니다. 이는 Evaluate() 추상 메서드에서 반환되는
Promise 객체를 해결하는 데 사용됩니다. 해당 모듈의 의존성에는 empty 가 되며,
일부 의존성에 대해 최상위 Evaluate()가 시작된 경우를 제외합니다.
[[AsyncParentModules]]
List
of Cyclic Module
Records
이 모듈 또는 의존성이 [[HasTLA]]
true 이고, 실행이 진행 중이라면, 이 필드는 최상위 실행 작업에 대한 이 모듈의 부모
importers를 추적합니다. 이 부모 모듈들은 이 모듈이 성공적으로 실행 완료되기 전까지는 실행을 시작하지 않습니다.
[[PendingAsyncDependencies]]
integer 또는
empty
이 모듈에 비동기 의존성이 있으면, 이 필드는 해당 모듈이 실행될 때까지 남은 비동기 의존성 모듈의 수를 추적합니다. 비동기
의존성이 있는 모듈은 이 값이 0이 되고 실행 오류가 없을 때 실행됩니다.
표 44 에 정의된 메서드들 외에도
순환 모듈
레코드 는 표 46 에 나열된 추가 메서드들을 가집니다.
표 46: 순환 모듈 레코드 의 추가 추상 메서드
GraphLoadingState 레코드 는 모듈 그래프의 로딩 과정에 대한 정보를 담고 있는 Record 입니다. 이는
HostLoadImportedModule 호출 이후 로딩을
계속하기 위해 사용됩니다. 각 GraphLoadingState 레코드 는 표 47 에 정의된 필드들을 가집니다:
표 47: GraphLoadingState 레코드 의 필드
16.2.1.6.1 모듈 레코드 추상 메서드의 구현
아래는 순환 모듈 레코드 에 대한 구체적인 메서드로, 모듈 레코드 추상 메서드(표 44 에 정의됨)를
구현합니다.
16.2.1.6.1.1 LoadRequestedModules (
[hostDefined ] )
순환 모듈 레코드 module 의
LoadRequestedModules 구체적인 메서드는 선택적 인자 hostDefined (임의 값)을 받고 Promise를
반환합니다. 이 메서드는 module 의 의존성 그래프에 있는 모든 모듈 레코드 의 [[LoadedModules]] 를 채웁니다(대부분의 작업은 보조 함수 InnerModuleLoading 에서 수행됩니다).
선택적 hostDefined 파라미터는 HostLoadImportedModule 훅에
전달됩니다. 호출 시 다음과 같은 절차를 수행합니다:
hostDefined 가 없으면 hostDefined 를
empty 로 설정한다.
pc 를 ! NewPromiseCapability (%Promise% )로 설정한다.
state 를 GraphLoadingState
Record { [[IsLoading]] :
true , [[PendingModulesCount]] :
1, [[Visited]] : « », [[PromiseCapability]] : pc , [[HostDefined]] : hostDefined }로
설정한다.
InnerModuleLoading (state ,
module )을 수행한다.
pc .[[Promise]] 를 반환한다.
참고
hostDefined 인자는 import된 모듈을 가져오는데 필요한 추가 정보를 전달하는 데 사용할 수 있습니다. 예를 들어
HTML에서는 <link rel="preload" as="..."> 태그에 대해 올바른 fetch
destination을 설정하는 데 사용합니다.
import() 표현식에서는 hostDefined 인자를 절대 설정하지 않습니다.
16.2.1.6.1.1.1 InnerModuleLoading (
state , module )
추상 연산 InnerModuleLoading은 state (GraphLoadingState
Record )와 module (모듈 레코드 )를 인자로 받고,
unused 를 반환합니다. LoadRequestedModules에서 module 의
의존성 그래프에 대해 실제 로딩 과정을 재귀적으로 수행할 때 사용됩니다. 호출 시 다음과 같은 절차를 수행합니다:
Assert : state .[[IsLoading]] 이 true 임을 확인한다.
module 이 순환 모듈
레코드 이고, module .[[Status]] 가 new 이며,
state .[[Visited]] 에
module 이 포함되어 있지 않으면, 다음을 수행한다:
module 을 state .[[Visited]] 에 추가한다.
requestedModulesCount 를 module .[[RequestedModules]] 의 요소 수로 설정한다.
state .[[PendingModulesCount]] 를
state .[[PendingModulesCount]] +
requestedModulesCount 로 설정한다.
module .[[RequestedModules]] 의
각 ModuleRequest
Record request 에 대해 다음을 수행한다:
AllImportAttributesSupported (request .[[Attributes]] )가
false 이면:
error 를 ThrowCompletion (새로
생성된 SyntaxError 객체)로 설정한다.
ContinueModuleLoading (state ,
error )를 수행한다.
그렇지 않고 module .[[LoadedModules]] 에 LoadedModuleRequest
Record record 가 존재하며,
ModuleRequestsEqual (record ,
request )가 true 이면:
InnerModuleLoading (state ,
record .[[Module]] )을 수행한다.
그 밖의 경우,
HostLoadImportedModule (module ,
request , state .[[HostDefined]] ,
state )를 수행한다.
참고: HostLoadImportedModule 는
FinishLoadingImportedModule 를
호출하며, 이는 ContinueModuleLoading 를
통해 그래프 로딩 프로세스에 재진입합니다.
state .[[IsLoading]] 이
false 이면
unused 를 반환한다.
Assert : state .[[PendingModulesCount]] ≥ 1임을 확인한다.
state .[[PendingModulesCount]] 를
state .[[PendingModulesCount]] - 1로
설정한다.
state .[[PendingModulesCount]] = 0이면
다음을 수행한다:
state .[[IsLoading]] 를
false 로 설정한다.
state .[[Visited]] 의 각
순환 모듈 레코드
loaded 에 대해 다음을 수행한다:
loaded .[[Status]] 가
new 이면 loaded .[[Status]] 를
unlinked 로 설정한다.
! Call (state .[[PromiseCapability]] .[[Resolve]] ,
undefined ,
«undefined »)를 수행한다.
unused 를 반환한다.
16.2.1.6.1.1.2 ContinueModuleLoading (
state , moduleCompletion )
추상 연산 ContinueModuleLoading은 state (GraphLoadingState
Record )와 moduleCompletion (정상 완료(normal
completion) 로 모듈 레코드 를 포함하거나,
throw
completion 중 하나) 두 인자를 받아 unused 를
반환합니다. 이 연산은 HostLoadImportedModule
호출 이후 로딩 과정을 다시 진입할 때 사용됩니다. 호출 시 다음의 절차를 수행합니다:
state .[[IsLoading]] 이
false 이면 unused 를 반환한다.
moduleCompletion 이 정상 완료(normal
completion) 인 경우:
InnerModuleLoading (state ,
moduleCompletion .[[Value]] )를
수행한다.
그 밖의 경우:
state .[[IsLoading]] 를
false 로 설정한다.
! Call (state .[[PromiseCapability]] .[[Reject]] ,
undefined , « moduleCompletion .[[Value]] »)를 수행한다.
unused 를 반환한다.
16.2.1.6.1.2 Link ( )
순환 모듈 레코드 module 의
Link 구체적 메서드는 인자를 받지 않으며, 정상 완료(normal
completion) 로 unused 를 포함하거나 throw
completion 를 반환합니다. 성공 시 Link는 이 모듈의 [[Status]] 를 unlinked 에서
linked 로 전이시킵니다. 실패 시 예외가 throw되고 이 모듈의 [[Status]] 는 unlinked 상태로 남습니다. (대부분의
작업은 보조 함수 InnerModuleLinking 에서 수행됩니다.)
호출 시 다음의 절차를 수행합니다:
Assert : module .[[Status]] 는 unlinked ,
linked , evaluating-async , 또는
evaluated 중 하나이다.
stack 을 새로운 빈 List 로
설정한다.
result 를 Completion (InnerModuleLinking (module ,
stack , 0))로 설정한다.
result 가 비정상 완료(abrupt
completion) 인 경우:
stack 의 각 순환 모듈
레코드 m 에 대해 다음을 수행한다:
Assert :
m .[[Status]] 는
linking 이다.
m .[[Status]] 를
unlinked 로 설정한다.
Assert : module .[[Status]] 는
unlinked 이다.
? result 를 반환한다.
Assert : module .[[Status]] 는 linked ,
evaluating-async , 또는 evaluated
중 하나이다.
Assert : stack 이 비어 있다.
unused 를 반환한다.
16.2.1.6.1.2.1 InnerModuleLinking (
module , stack , index )
추상 연산 InnerModuleLinking은 module (모듈 레코드 ),
stack (List of
순환 모듈 레코드 ),
index (음이 아닌 integer ) 인자를 받아, 정상 완료(normal
completion) 로 음이 아닌 integer 를 포함하거나 throw
completion 를 반환합니다. Link에서 module 의 실제 linking
과정을 수행하며, 의존성 그래프의 다른 모든 모듈에 대해 재귀적으로 동작합니다. stack , index
인자와 모듈의 [[DFSAncestorIndex]] 필드는 깊이 우선 탐색(DFS) 과정을 추적하는
데 사용됩니다. 특히 [[DFSAncestorIndex]] 는 강하게 연결된 구성 요소(SCC)를
찾기 위한 용도로 활용되어, SCC 내의 모든 모듈이 함께 linked 로 전이됩니다. 호출 시 다음의
절차를 수행합니다:
module 이 순환 모듈
레코드 가 아니면:
? module .Link()를 수행한다.
index 를 반환한다.
module .[[Status]] 가
linking , linked ,
evaluating-async , 또는
evaluated 중 하나이면:
index 를 반환한다.
Assert : module .[[Status]] 는 unlinked 이다.
module .[[Status]] 를
linking 로 설정한다.
moduleIndex 를 index 로 설정한다.
module .[[DFSAncestorIndex]] 를
index 로 설정한다.
index 를 index + 1로 설정한다.
module 을 stack 에 추가한다.
module .[[RequestedModules]] 의 각
ModuleRequest Record
request 에 대해 다음을 수행한다:
requiredModule 을 GetImportedModule (module ,
request )로 설정한다.
index 를 ? InnerModuleLinking (requiredModule ,
stack , index )로 설정한다.
requiredModule 이 순환 모듈 레코드 이면:
Assert :
requiredModule .[[Status]] 는
linking ,
linked ,
evaluating-async , 또는
evaluated 중 하나이다.
Assert :
requiredModule .[[Status]] 가
linking 인 경우에만 stack 에
requiredModule 이 포함되어 있다.
requiredModule .[[Status]] 가
linking 이면:
module .[[DFSAncestorIndex]] 를
min (module .[[DFSAncestorIndex]] ,
requiredModule .[[DFSAncestorIndex]] )로
설정한다.
? module .InitializeEnvironment()를 수행한다.
Assert : module 이
stack 에 정확히 한 번만 존재한다.
Assert : module .[[DFSAncestorIndex]] ≤ moduleIndex 이다.
module .[[DFSAncestorIndex]] =
moduleIndex 이면:
done 을 false 로 설정한다.
done 이 false 인 동안 반복한다:
requiredModule 을 stack 의 마지막 요소로
설정한다.
stack 의 마지막 요소를 제거한다.
Assert :
requiredModule 은 순환 모듈
레코드 이다.
requiredModule .[[Status]] 를
linked 로 설정한다.
requiredModule 과 module 이 동일한
모듈
레코드 이면 done 을
true 로 설정한다.
index 를 반환한다.
16.2.1.6.1.3 Evaluate ( )
순환 모듈 레코드 module 의
Evaluate 구체적 메서드는 인자를 받지 않으며 Promise를 반환합니다. Evaluate는 이 모듈의 [[Status]] 를 linked 에서
evaluating-async 또는 evaluated 로 전이시킵니다.
해당 강하게 연결된 구성 요소 내의 모듈에 대해 처음 호출될 때, Evaluate는 모듈 평가가 완료될 때 resolve되는 Promise를 생성하여
반환합니다. 이 Promise는 해당 구성 요소의 [[CycleRoot]] 의 [[TopLevelCapability]] 필드에 저장됩니다. 이후 해당 구성 요소 내의 어떤 모듈에 대해
Evaluate를 호출해도 동일한 Promise를 반환합니다. (대부분의 작업은 보조 함수 InnerModuleEvaluation 에서
수행됩니다.) 호출 시 다음 절차를 수행합니다:
Assert : 이 Evaluate 호출은 주변
에이전트 내에서 다른 Evaluate 호출과 동시에 발생하지 않는다.
Assert : module .[[Status]] 는 linked ,
evaluating-async 또는 evaluated
중 하나이다.
module .[[Status]] 가
evaluating-async 또는
evaluated 라면, module 을
module .[[CycleRoot]] 로 설정한다.
module .[[TopLevelCapability]] 가
empty 가 아니면:
module .[[TopLevelCapability]] .[[Promise]] 를 반환한다.
stack 을 새로운 빈 List 로
설정한다.
capability 를 ! NewPromiseCapability (%Promise% )로 설정한다.
module .[[TopLevelCapability]] 를
capability 로 설정한다.
result 를 Completion (InnerModuleEvaluation (module ,
stack , 0))로 설정한다.
result 가 비정상 완료(abrupt
completion) 인 경우:
stack 의 각 순환 모듈
레코드 m 에 대해 다음을 수행한다:
Assert :
m .[[Status]] 는
evaluating 이다.
Assert :
m .[[AsyncEvaluationOrder]] 는
unset 이다.
m .[[Status]] 를
evaluated 로 설정한다.
m .[[EvaluationError]] 를
result 로 설정한다.
Assert : module .[[Status]] 는
evaluated 이다.
Assert : module .[[EvaluationError]] 와 result 는 동일한
Completion
Record 이다.
! Call (capability .[[Reject]] , undefined , «
result .[[Value]] »)를 수행한다.
그 밖의 경우:
Assert : module .[[Status]] 는
evaluating-async 또는
evaluated 이다.
Assert : module .[[EvaluationError]] 는
empty 이다.
module .[[Status]] 가
evaluated 라면:
참고: 이는 module 의 평가가 동기적으로 완료됨을 의미한다.
Assert :
module .[[AsyncEvaluationOrder]] 는
unset 이다.
! Call (capability .[[Resolve]] ,
undefined , «
undefined »)를 수행한다.
Assert : stack 이 비어
있다.
capability .[[Promise]] 를 반환한다.
16.2.1.6.1.3.1 InnerModuleEvaluation (
module , stack , index )
추상 연산 InnerModuleEvaluation은 module (모듈 레코드 ),
stack (List of
순환 모듈 레코드 ),
index (음이 아닌 integer ) 인자를 받아, 정상 완료(normal
completion) 로 음이 아닌 integer 를 포함하거나 throw
completion 를 반환합니다. Evaluate에서 module 의 실제 평가
과정을 수행하며, 의존성 그래프의 다른 모든 모듈에 대해 재귀적으로 동작합니다. stack , index
인자와 module 의 [[DFSAncestorIndex]] 필드는
InnerModuleLinking 에서와 동일하게
사용됩니다. 호출 시 다음 절차를 수행합니다:
module 이 순환 모듈
레코드 가 아니면:
? EvaluateModuleSync (module )를
수행한다.
index 를 반환한다.
module .[[Status]] 가
evaluating-async 또는
evaluated 라면:
module .[[EvaluationError]] 가
empty 이면 index 를 반환한다.
그 밖의 경우, ? module .[[EvaluationError]] 를 반환한다.
module .[[Status]] 가
evaluating 이면 index 를 반환한다.
Assert : module .[[Status]] 는 linked 이다.
module .[[Status]] 를
evaluating 로 설정한다.
moduleIndex 를 index 로 설정한다.
module .[[DFSAncestorIndex]] 를
index 로 설정한다.
module .[[PendingAsyncDependencies]] 를
0으로 설정한다.
index 를 index + 1로 설정한다.
module 을 stack 에 추가한다.
module .[[RequestedModules]] 의 각
ModuleRequest Record
request 에 대해 다음을 수행한다:
requiredModule 을 GetImportedModule (module ,
request )로 설정한다.
index 를 ? InnerModuleEvaluation (requiredModule ,
stack , index )로 설정한다.
requiredModule 이 순환 모듈 레코드 이면:
Assert :
requiredModule .[[Status]] 는
evaluating ,
evaluating-async 또는
evaluated 중 하나이다.
Assert :
requiredModule .[[Status]] 가
evaluating 일 때만 stack 에
requiredModule 이 포함되어 있다.
requiredModule .[[Status]] 가
evaluating 이면:
module .[[DFSAncestorIndex]] 를
min (module .[[DFSAncestorIndex]] ,
requiredModule .[[DFSAncestorIndex]] )로
설정한다.
그 밖의 경우:
requiredModule 을
requiredModule .[[CycleRoot]] 로 설정한다.
Assert :
requiredModule .[[Status]] 는
evaluating-async 또는
evaluated 이다.
requiredModule .[[EvaluationError]] 가
empty 가 아니면
? requiredModule .[[EvaluationError]] 를
반환한다.
requiredModule .[[AsyncEvaluationOrder]] 가
integer 라면:
module .[[PendingAsyncDependencies]] 를
module .[[PendingAsyncDependencies]]
+ 1로 설정한다.
module 을
requiredModule .[[AsyncParentModules]] 에
추가한다.
module .[[PendingAsyncDependencies]]
> 0이거나 module .[[HasTLA]] 가
true 이면:
Assert :
module .[[AsyncEvaluationOrder]] 는
unset 이다.
module .[[AsyncEvaluationOrder]] 를 IncrementModuleAsyncEvaluationCount ()로
설정한다.
module .[[PendingAsyncDependencies]] = 0이면
ExecuteAsyncModule (module )를
수행한다.
그 밖의 경우:
? module .ExecuteModule() 을
수행한다.
Assert : module 이
stack 에 정확히 한 번만 존재한다.
Assert : module .[[DFSAncestorIndex]] ≤ moduleIndex 이다.
module .[[DFSAncestorIndex]] =
moduleIndex 이면:
done 을 false 로 설정한다.
done 이 false 인 동안 반복한다:
requiredModule 을 stack 의 마지막 요소로
설정한다.
stack 의 마지막 요소를 제거한다.
Assert :
requiredModule 은 순환 모듈
레코드 이다.
Assert :
requiredModule .[[AsyncEvaluationOrder]] 는
integer 또는
unset 이다.
requiredModule .[[AsyncEvaluationOrder]] 가
unset 이면
requiredModule .[[Status]] 를
evaluated 로 설정한다.
그 밖의 경우 requiredModule .[[Status]] 를
evaluating-async 로 설정한다.
requiredModule 과 module 이 동일한
모듈
레코드 이면 done 을
true 로 설정한다.
requiredModule .[[CycleRoot]] 를
module 로 설정한다.
index 를 반환한다.
Note 1
모듈은 InnerModuleEvaluation에 의해 순회되는 동안 evaluating
상태이며, 실행이 끝나면 evaluated 상태가 되고, [[HasTLA]] 필드가 true 이거나 비동기
의존성이 있을 경우 실행 중 evaluating-async 상태가 됩니다.
Note 2
비동기 사이클의 모듈에 의존하는 모든 모듈은 해당 사이클이 evaluating 상태가 아닐
때, [[CycleRoot]] 를 통해 사이클의 루트 실행에 의존하게 됩니다. 이를
통해 사이클의 상태를 루트 모듈 상태를 통해 하나의 강하게 연결된 구성 요소로 취급할 수 있습니다.
16.2.1.6.1.3.2 ExecuteAsyncModule (
module )
추상 연산 ExecuteAsyncModule은 module (순환 모듈 레코드 ) 인자를 받아
unused 를 반환합니다. 호출 시 다음 절차를 수행합니다:
Assert : module .[[Status]] 는 evaluating 또는
evaluating-async 중 하나이다.
Assert : module .[[HasTLA]] 가 true 이다.
capability 를 ! NewPromiseCapability (%Promise% )로 설정한다.
fulfilledClosure 를 module 을 캡처하고 호출 시 다음을 수행하는, 파라미터
없는 새로운 추상 클로저(Abstract
Closure) 로 설정한다:
AsyncModuleExecutionFulfilled (module )을
수행한다.
NormalCompletion (undefined )를
반환한다.
onFulfilled 를 CreateBuiltinFunction (fulfilledClosure ,
0, "" , « »)로 설정한다.
rejectedClosure 를 module 을 캡처하고 호출 시 다음을 수행하는,
파라미터(error )를 갖는 새로운 추상 클로저(Abstract
Closure) 로 설정한다:
AsyncModuleExecutionRejected (module ,
error )를 수행한다.
NormalCompletion (undefined )를
반환한다.
onRejected 를 CreateBuiltinFunction (rejectedClosure ,
0, "" , « »)로 설정한다.
PerformPromiseThen (capability .[[Promise]] , onFulfilled ,
onRejected )를 수행한다.
! module .ExecuteModule (capability )을
수행한다.
unused 를 반환한다.
16.2.1.6.1.3.3 GatherAvailableAncestors (
module , execList )
추상 연산 GatherAvailableAncestors는 module (순환 모듈 레코드 ),
execList (List of
순환 모듈 레코드 ) 인자를 받아
unused 를 반환합니다. 호출 시 다음 절차를 수행합니다:
module .[[AsyncParentModules]] 의 각
순환 모듈 레코드
m 에 대해 다음을 수행한다:
execList 에 m 이 없고 m .[[CycleRoot]] .[[EvaluationError]] 가
empty 라면:
Assert :
m .[[Status]] 는
evaluating-async 이다.
Assert :
m .[[EvaluationError]] 는
empty 이다.
Assert :
m .[[AsyncEvaluationOrder]] 는
integer 이다.
Assert :
m .[[PendingAsyncDependencies]]
> 0이다.
m .[[PendingAsyncDependencies]] 를
m .[[PendingAsyncDependencies]] -
1로 설정한다.
m .[[PendingAsyncDependencies]] =
0이면:
m 을 execList 에 추가한다.
m .[[HasTLA]] 가
false 이면 GatherAvailableAncestors (m ,
execList )를 수행한다.
unused 를 반환한다.
Note
루트 module 의 비동기 실행이 fulfilled(이행)될 때, 이 함수는 해당 완료와 함께 동기적으로 실행
가능한 모듈들의 리스트를 결정하여 execList 에 채웁니다.
16.2.1.6.1.3.4 AsyncModuleExecutionFulfilled (
module )
추상 연산 AsyncModuleExecutionFulfilled는 module (순환 모듈 레코드 ) 인자를 받아
unused 를 반환합니다. 호출 시 다음 절차를 수행합니다:
module .[[Status]] 가
evaluated 라면:
Assert :
module .[[EvaluationError]] 는
empty 가 아니다.
unused 를 반환한다.
Assert : module .[[Status]] 는
evaluating-async 이다.
Assert : module .[[AsyncEvaluationOrder]] 는 integer 이다.
Assert : module .[[EvaluationError]] 는
empty 이다.
module .[[AsyncEvaluationOrder]] 를
done 로 설정한다.
module .[[Status]] 를
evaluated 로 설정한다.
module .[[TopLevelCapability]] 가
empty 가 아니면:
Assert :
module .[[CycleRoot]] 와
module 은 동일한 모듈
레코드 이다.
! Call (module .[[TopLevelCapability]] .[[Resolve]] ,
undefined , «
undefined »)를 수행한다.
execList 를 새로운 빈 List 로
설정한다.
GatherAvailableAncestors (module ,
execList )를 수행한다.
Assert : execList 의 모든
요소는 [[AsyncEvaluationOrder]] 필드가 integer 로, [[PendingAsyncDependencies]] 필드가 0으로, [[EvaluationError]] 필드가
empty 로 설정되어 있다.
sortedExecList 를 execList 의 요소들을 [[AsyncEvaluationOrder]] 필드 오름차순으로 정렬한 List 로
설정한다.
sortedExecList 의 각 순환 모듈
레코드 m 에 대해 다음을 수행한다:
m .[[Status]] 가
evaluated 라면:
Assert :
m .[[EvaluationError]] 는
empty 가 아니다.
그 밖의 경우 m .[[HasTLA]] 가
true 이면:
ExecuteAsyncModule (m )를
수행한다.
그 밖의 경우:
result 를 m .ExecuteModule() 로
설정한다.
result 가 비정상
완료(abrupt completion) 라면:
AsyncModuleExecutionRejected (m ,
result .[[Value]] )를 수행한다.
그 밖의 경우:
m .[[AsyncEvaluationOrder]] 를
done 로 설정한다.
m .[[Status]] 를
evaluated 로 설정한다.
m .[[TopLevelCapability]] 가
empty 가 아니면:
Assert :
m .[[CycleRoot]] 와
m 은 동일한 모듈
레코드 이다.
! Call (m .[[TopLevelCapability]] .[[Resolve]] ,
undefined , «
undefined »)를
수행한다.
unused 를 반환한다.
16.2.1.6.1.3.5 AsyncModuleExecutionRejected (
module , error )
추상 연산 AsyncModuleExecutionRejected는 module (순환 모듈 레코드 ),
error (ECMAScript 언어
값 ) 인자를 받아 unused 를 반환합니다. 호출 시 다음
절차를 수행합니다:
module .[[Status]] 가
evaluated 라면:
Assert :
module .[[EvaluationError]] 는
empty 가 아니다.
unused 를 반환한다.
Assert : module .[[Status]] 는
evaluating-async 이다.
Assert : module .[[AsyncEvaluationOrder]] 는 integer 이다.
Assert : module .[[EvaluationError]] 는
empty 이다.
module .[[EvaluationError]] 를
ThrowCompletion (error )로
설정한다.
module .[[Status]] 를
evaluated 로 설정한다.
module .[[AsyncEvaluationOrder]] 를
done 로 설정한다.
참고: module .[[AsyncEvaluationOrder]] 는
AsyncModuleExecutionFulfilled 와의
대칭성을 위해 done 로 설정됩니다. InnerModuleEvaluation 에서는
모듈의 [[EvaluationError]] 내부 슬롯이
empty 가 아니면 [[AsyncEvaluationOrder]] 내부 슬롯 값은 사용되지 않습니다.
module .[[AsyncParentModules]] 의 각
순환 모듈 레코드
m 에 대해 다음을 수행한다:
AsyncModuleExecutionRejected (m ,
error )를 수행한다.
module .[[TopLevelCapability]] 가
empty 가 아니면:
Assert :
module .[[CycleRoot]] 와
module 은 동일한 모듈
레코드 이다.
! Call (module .[[TopLevelCapability]] .[[Reject]] ,
undefined , « error »)를 수행한다.
unused 를 반환한다.
16.2.1.6.2 순환 모듈 레코드 그래프 예시
이 비규범 섹션에서는 몇 가지 일반적인 모듈 그래프의 연결(linking) 및 평가(evaluation) 예시를 시리즈로 보여주며, 특히 오류가 어떻게 발생할
수 있는지에 중점을 둡니다.
먼저 다음과 같은 간단한 모듈 그래프를 생각해 보겠습니다:
그림 2: 간단한 모듈 그래프
먼저 오류 조건이 없다고 가정해 봅시다. 호스트 가 처음으로 A .LoadRequestedModules()를 호출하면,
가정에 따라 성공적으로 완료되고, B 와 C 의 의존성도 재귀적으로 로드됩니다(각각 C 및 없음).
그리고 A .[[Status]] = B .[[Status]] = C .[[Status]] =
unlinked 로 설정됩니다. 이후 호스트 가 A .Link()를 호출하면, 다시 가정에 따라 성공적으로 완료되어
A .[[Status]] = B .[[Status]] = C .[[Status]] =
linked가 됩니다. 이러한 준비 단계는 언제든 수행할 수 있습니다. 나중에 호스트 가 모듈의 부작용이 발생할 수 있는 시점에 A .Evaluate()를
호출하면, 성공적으로 완료되어 Promise가 undefined 로 resolve되고, 먼저 C 다음에
B 가 평가됩니다. 이 시점에서 각 모듈의 [[Status]] 는
evaluated 입니다.
그 다음 성공적으로 A .LoadRequestedModules()를 호출한 뒤 연결(linking) 오류가 발생하는 경우를 생각해 봅시다.
만일 InnerModuleLinking 이 C 에서
성공하지만, 이후 B 에서 실패한다면(예를 들어 B 가 C 가 제공하지 않는 것을 import하는
경우), 원래의 A .Link()는 실패하고, A 와 B 의 [[Status]] 는 unlinked 인 상태로 남습니다.
C 의 [[Status]] 는 linked 가 됩니다.
마지막으로, Link()를 성공적으로 호출한 뒤 평가 오류가 발생하는 경우를 생각해 보겠습니다. 만일 InnerModuleEvaluation 이
C 에서 성공하지만, 이후 B 에서 실패한다면(예를 들어 B 가 예외를 던지는 코드를 포함하는 경우),
원래의 A .Evaluate()는 실패하여 rejected Promise를 반환하게 됩니다. 결과적인 예외는 A 와
B 의 [[EvaluationError]] 필드에 저장되고, 두 모듈의 [[Status]] 는 evaluated 가 됩니다. C 도
evaluated 가 되지만, A 와 B 와 달리 [[EvaluationError]] 없이 성공적으로 평가를 완료합니다. 예외를 저장하는 것은 호스트 가 A 나
B 를 Evaluate()로 재사용하려 할 때 항상 동일한 예외를 만나도록 보장합니다. (호스트 는 순환 모듈
레코드 를 반드시 재사용할 필요는 없으며, 호스트 가 해당 메서드에서 던져진 예외 객체를 반드시 노출할 필요도 없습니다. 하지만 명세상
이러한 동작이 가능하도록 되어 있습니다.)
이제 다른 종류의 오류 조건을 생각해 봅시다:
그림 3: 해결 불가능한 모듈이 있는 모듈 그래프
이 시나리오에서 A 모듈은 다른 모듈에 대한 의존성을 선언하지만, 해당 모듈에 대한 모듈 레코드 가 존재하지 않습니다. 즉,
HostLoadImportedModule 가 요청 시
FinishLoadingImportedModule 를
예외와 함께 호출합니다. 이는 해당 리소스가 존재하지 않거나, 리소스는 존재하지만 ParseModule 가 소스 텍스트 파싱 시
오류를 반환하는 등 다양한 이유로 발생할 수 있습니다. 호스트 는 FinishLoadingImportedModule 에
전달한 완료(completion)를 통해 실패 원인을 노출할 수도 있습니다. 어쨌든 이 예외는 로딩 실패를 초래하며, A 의 [[Status]] 는 new 상태로 남습니다.
여기서 로딩, 연결, 평가 오류의 차이는 다음과 같은 특성 때문입니다:
평가(Evaluation) 는 부작용이 있을 수 있으므로 반드시 한
번만 수행되어야 하며, 평가가 이미 수행됐는지(성공하지 않았더라도) 기억하는 것이 중요합니다. (오류의 경우에도 예외를 기억하는 것이 합리적인데,
그렇지 않으면 이후 Evaluate() 호출마다 새 예외를 생성해야 합니다.)
반면 연결(linking)은 부작용이 없으므로 실패하더라도 나중에 재시도해도 문제가 없습니다.
로딩은 호스트 와 밀접하게
상호작용하며, 호스트에 따라 실패한 로딩을 재시도할 수 있도록 하는 것이 바람직할 수 있습니다.(예: 네트워크 장애 등 일시적 문제일 경우)
이제 사이클이 있는 모듈 그래프를 생각해 봅시다:
그림 4: 순환 모듈 그래프
여기서는 진입점이 A 모듈이라고 가정합니다. 호스트 가 A .LoadRequestedModules()를 호출하면
InnerModuleLoading 이 A 에
대해 실행됩니다. 이것은 다시 B 와 C 에 대해 InnerModuleLoading 을
호출합니다. 사이클 때문에 다시 InnerModuleLoading 이 A 에
대해 트리거되지만, 이 시점에서는 A 의 의존성 로딩이 이미 시작됐으므로 아무 작업도 하지 않습니다(no-op). 그래프의 모든 모듈이
성공적으로 로드되면 이들의 [[Status]] 가 동시에 new 에서
unlinked 로 전이됩니다.
그 다음 호스트 가
A .Link()를 호출하면 InnerModuleLinking 이 A 에
대해 실행됩니다. 이것은 다시 B 에 대해 InnerModuleLinking 을 호출합니다. 사이클 때문에
다시 InnerModuleLinking 이 A 에
대해 트리거되지만, 이 시점에서는 A .[[Status]] 가 이미
linking 이므로 아무 작업도 하지 않습니다(no-op). B .[[Status]] 자체는 linking 상태로 남아 있다가 제어가 다시 A 로
돌아오면 C 에 대해 InnerModuleLinking 이 트리거됩니다.
C .[[Status]] 가 linked 가 되고 나면
A 와 B 가 함께 linking 에서
linked 로 전이됩니다. 이는 두 모듈이 강하게 연결된 구성 요소이기 때문입니다. 모듈 그래프가 깊이우선탐색으로
순회되는 이 단계에서는 SCC 내의 모듈들을 동시에 상태 전이시킬 수 있습니다.
성공 케이스에서는 순환 모듈 그래프의 평가(evaluation) 단계도 위와 유사하게 동작합니다.
이제 A 에 연결 오류가 있는 경우를 생각해 보겠습니다. 예를 들어 A 가 C 에 존재하지 않는 바인딩을
import하려고 하는 경우입니다. 이 경우 위의 단계는 여전히 발생하며, InnerModuleLinking 의
두 번째 호출에서 조기 반환(early return)이 있습니다. 그러나 원래의 InnerModuleLinking 에
다시 되돌아오면, InitializeEnvironment(특히 C .ResolveExport() 직후)에서 실패하게 됩니다. 던져진
SyntaxError 예외는 A .Link까지 전파되고, 이때 현재 스택에 있는 모든 모듈(항상 아직
linking 상태인 모듈들)을 reset합니다. 따라서 A 와 B 는
unlinked 가 됩니다. C 는 linked 상태로
남습니다.
또는 A 에 평가 오류가 있는 경우(예: 소스 코드가 예외를 던지는 경우)를 생각해 봅니다. 이 경우 평가 단계에서도 위와 유사한 과정이
발생하며, InnerModuleEvaluation 의 두 번째
호출에서 조기 반환이 있습니다. 원래의 InnerModuleEvaluation 에 되돌아오면,
가정에 따라 실패하게 됩니다. 던져진 예외는 A .Evaluate()까지 전파되고, 이때 현재 스택에 있는 모든 모듈(아직
evaluating 상태인 모듈들)과 [[AsyncParentModules]] 를 통해, 의존성 그래프 전체에서 최상위 await를
포함하거나 의존하는 모듈 체인에도 오류가 기록됩니다(AsyncModuleExecutionRejected
알고리즘을 통해). 따라서 A 와 B 는 evaluated 가 되고, 예외가
A 와 B 의 [[EvaluationError]] 필드에 기록되며,
C 는 evaluated 이지만 [[EvaluationError]] 는 없습니다.
마지막으로, 모든 모듈이 비동기적으로 완료되는 사이클이 있는 모듈 그래프를 생각해 봅시다:
그림 5: 비동기 순환 모듈 그래프
로딩 및 연결은 이전과 같이 진행되며, 모든 모듈의 [[Status]] 는
linked 가 됩니다.
A .Evaluate()를 호출하면 InnerModuleEvaluation 이
A , B , D 에 대해 호출되어 모두 evaluating
상태로 전이됩니다. 그 후 InnerModuleEvaluation 이
A 에 대해 한 번 더 호출되지만 이미 evaluating 상태이므로 아무 작업도 하지
않습니다(no-op). 이 시점에서 D .[[PendingAsyncDependencies]] 가
0이므로 ExecuteAsyncModule (D )가
호출되고, D .ExecuteModule이 새로운 PromiseCapability와 함께 호출되어 D 의 비동기 실행을
추적합니다. 다시 InnerModuleEvaluation 로 돌아가서
B 에 대해 B .[[PendingAsyncDependencies]] 를 1로,
B .[[AsyncEvaluationOrder]] 를 1로 설정합니다. 다시 InnerModuleEvaluation 의 원래 호출로
돌아가서 A 의 [[PendingAsyncDependencies]] 를 1로 설정합니다. 다음
반복에서 A 의 의존성 루프가 끝나면 InnerModuleEvaluation 이
C 에 대해, 그리고 D (다시 no-op), E 에 대해 호출됩니다. E 는 의존성이
없고 사이클에도 포함되지 않으므로 ExecuteAsyncModule (E )가
D 와 동일하게 호출되고 E 는 바로 스택에서 제거됩니다. 다시 한 번 InnerModuleEvaluation 의
C 호출로 돌아와 C .[[AsyncEvaluationOrder]] 를 3으로
설정합니다. 이제 A 의 의존성 루프가 끝나면 A .[[AsyncEvaluationOrder]] 를 4로 설정하고, 전체 SCC를 스택에서 제거하여 모든 모듈이 동시에
evaluating-async 로 전이됩니다. 이 시점에서 모듈들의 필드는 표 48 에 나옵니다.
표 48: 초기 Evaluate() 호출 후 모듈 필드
필드
모듈
A
B
C
D
E
[[DFSAncestorIndex]]
0
0
0
0
4
[[Status]]
evaluating-async
evaluating-async
evaluating-async
evaluating-async
evaluating-async
[[AsyncEvaluationOrder]]
4
1
3
0
2
[[AsyncParentModules]]
« »
« A »
« A »
« B , C »
« C »
[[PendingAsyncDependencies]]
2 (B 및 C )
1 (D )
2 (D 및 E )
0
0
E 가 먼저 실행을 완료했다고 가정합니다. 이때 AsyncModuleExecutionFulfilled 가
호출되고 E .[[Status]] 가 evaluated 로
설정되며 C .[[PendingAsyncDependencies]] 가 1로 감소합니다. 업데이트된
모듈들의 필드는 표 49 에 나옵니다.
표 49: 모듈 E 실행 완료 후 모듈 필드
필드
모듈
C
E
[[DFSAncestorIndex]]
0
4
[[Status]]
evaluating-async
evaluated
[[AsyncEvaluationOrder]]
3
done
[[AsyncParentModules]]
« A »
« C »
[[PendingAsyncDependencies]]
1 (D )
0
D 가 다음으로 실행을 완료합니다(아직 실행 중인 유일한 모듈이었음). 이때 AsyncModuleExecutionFulfilled 가
다시 호출되고 D .[[Status]] 가
evaluated 로 설정됩니다. 실행 가능한 상위 모듈은 B ([[AsyncEvaluationOrder]] 가 1)와 C ([[AsyncEvaluationOrder]] 가 3)로, B 가 먼저 처리됩니다:
B .[[PendingAsyncDependencies]] 가 0으로 감소하고 ExecuteAsyncModule 가
B 에 호출되어 실행을 시작합니다. C .[[PendingAsyncDependencies]] 역시 0으로 감소하고 C 도 실행을
시작합니다(만약 B 에 await가 있으면 C 와 병렬로 실행될 수 있음). 업데이트된 모듈들의
필드는 표 50 에 나옵니다.
표 50: 모듈 D 실행 완료 후 모듈 필드
필드
모듈
B
C
D
[[DFSAncestorIndex]]
0
0
0
[[Status]]
evaluating-async
evaluating-async
evaluated
[[AsyncEvaluationOrder]]
1
3
done
[[AsyncParentModules]]
« A »
« A »
« B , C »
[[PendingAsyncDependencies]]
0
0
0
C 가 다음으로 실행을 완료했다고 가정합니다. 이때 AsyncModuleExecutionFulfilled 가
다시 호출되어 C .[[Status]] 가
evaluated 로 설정되고 A .[[PendingAsyncDependencies]] 가 1로 감소합니다. 업데이트된 모듈들의 필드는 표 51 에 나옵니다.
표 51: 모듈 C 실행 완료 후 모듈 필드
필드
모듈
A
C
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluating-async
evaluated
[[AsyncEvaluationOrder]]
4
done
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
1 (B )
0
그 다음 B 가 실행을 완료합니다. 이때 AsyncModuleExecutionFulfilled 가
다시 호출되고 B .[[Status]] 가
evaluated 로 설정됩니다. A .[[PendingAsyncDependencies]] 가 0으로 감소하므로 ExecuteAsyncModule 가 호출되어 실행을
시작합니다. 업데이트된 모듈들의 필드는 표
52 에 나옵니다.
표 52: 모듈 B 실행 완료 후 모듈 필드
필드
모듈
A
B
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluating-async
evaluated
[[AsyncEvaluationOrder]]
4
done
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
0
0
마지막으로 A 가 실행을 완료합니다. 이때 AsyncModuleExecutionFulfilled 가
다시 호출되어 A .[[Status]] 가
evaluated 로 설정됩니다. 이 시점에서 A .[[TopLevelCapability]] 의 Promise(A .Evaluate()에서 반환된
Promise)가 resolve되어 이 모듈 그래프의 처리가 종료됩니다. 업데이트된 모듈의 필드는 표 53 에 나옵니다.
표 53: 모듈 A 실행 완료 후 모듈 필드
필드
모듈
A
[[DFSAncestorIndex]]
0
[[Status]]
evaluated
[[AsyncEvaluationOrder]]
done
[[AsyncParentModules]]
« »
[[PendingAsyncDependencies]]
0
한편 C 가 실행에 실패하고 B 가 완료되기 전에 오류를 반환하는 실패 케이스를 생각해 봅시다. 이때 AsyncModuleExecutionRejected 가
호출되어 C .[[Status]] 가
evaluated 로, C .[[EvaluationError]] 가 오류로 설정됩니다. 그런 다음 이 오류는 모든
AsyncParentModules에 전파되어 각각에 대해 AsyncModuleExecutionRejected 가
호출됩니다. 업데이트된 모듈들의 필드는 표
54 에 나옵니다.
표 54: 모듈 C 오류 발생 후 모듈 필드
필드
모듈
A
C
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluated
evaluated
[[AsyncEvaluationOrder]]
done
done
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
1 (B )
0
[[EvaluationError]]
empty
C 의 평가 오류
A 는 C 와 동일한 오류로 rejected됩니다. 이는 C 가 A 에 대해
AsyncModuleExecutionRejected 를
C 의 오류로 호출하기 때문입니다. A .[[Status]] 는
evaluated 로 설정됩니다. 이 시점에서 A .[[TopLevelCapability]] 의 Promise(A .Evaluate()에서 반환된
Promise)는 reject됩니다. 업데이트된 모듈의 필드는 표 55 에 나옵니다.
표 55: 모듈 A 가 reject된 후 모듈 필드
필드
모듈
A
[[DFSAncestorIndex]]
0
[[Status]]
evaluated
[[AsyncEvaluationOrder]]
done
[[AsyncParentModules]]
« »
[[PendingAsyncDependencies]]
0
[[EvaluationError]]
C 의 평가 오류
그 후 B 는 오류 없이 실행을 마칩니다. 이 경우 AsyncModuleExecutionFulfilled 가
다시 호출되고 B .[[Status]] 가
evaluated 로 설정됩니다. GatherAvailableAncestors 가
B 에 대해 호출됩니다. 그러나 A .[[CycleRoot]] 는 평가 오류가
있는 A 이므로 반환된 sortedExecList 에 추가되지 않으며 AsyncModuleExecutionFulfilled 는
추가 처리를 하지 않고 반환됩니다. 이후 B 를 import하는 모듈은 C 에서 사이클 루트 A 에
설정된 평가 오류를 B .[[CycleRoot]] .[[EvaluationError]] 의 rejection으로 처리하게 됩니다. 업데이트된 모듈의 필드는
표 56 에 나와 있습니다.
표 56: 오류가 있는 그래프에서 B 가 실행 완료된 후의 모듈 필드
필드
모듈
A
B
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluated
evaluated
[[AsyncEvaluationOrder]]
4
1
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
0
0
[[EvaluationError]]
C 의 Evaluation 오류
empty
16.2.1.7 소스 텍스트 모듈 레코드
소스 텍스트
모듈 레코드 는 ECMAScript 소스 텍스트 (11 )로 정의된 모듈에 대한 정보를 나타내는
데 사용되며, goal symbol Module 을 사용하여 파싱됩니다. 그 필드에는 모듈이
import 및 export하는 이름에 대한 정제된 정보가 담겨 있으며, 구체적 메서드는 이 정보들을 사용하여 모듈을 linking 및 평가합니다.
소스
텍스트 모듈 레코드 는 추상 모듈 레코드 타입의 다른 하위
클래스들과 함께 모듈 그래프 내에 존재할 수 있고, 순환 모듈 레코드 타입의 다른 하위 클래스들과 사이클에 참여할 수
있습니다.
표 45 에 정의된 필드 외에도, 소스 텍스트
모듈 레코드 는 표 57 에
나열된 추가 필드를 가집니다. 이러한 필드는 모두 ParseModule 에서 최초로 설정됩니다.
표 57: 소스 텍스트 모듈 레코드 의 추가 필드
ImportEntry
레코드 는 단일 선언적 import에 대한 정보를 정제한 레코드 입니다. 각 ImportEntry
레코드 는 표 58 에 정의된 필드를
가집니다:
표 58: ImportEntry 레코드 의 필드
참고 1
표
59 는 구문 import 형태를 표현하는 데 사용되는 ImportEntry 레코드 필드 예시를 제공합니다:
표 59(참고): ImportEntry 레코드 형태로 Import
구문 매핑
import문 형식
[[ModuleRequest]]
[[ImportName]]
[[LocalName]]
import v from "mod";
"mod"
"default"
"v"
import * as ns from "mod";
"mod"
namespace-object
"ns"
import {x} from "mod";
"mod"
"x"
"x"
import {x as v} from "mod";
"mod"
"x"
"v"
import "mod";
ImportEntry
레코드 가 생성되지 않습니다.
ExportEntry
레코드 는 단일 선언적 export에 대한 정보를 정제한 레코드 입니다. 각 ExportEntry
레코드 는 표 60 에 정의된 필드를 가집니다:
표 60: ExportEntry 레코드 의 필드
참고 2
표
61 는 구문 export 형태를 표현하는 데 사용되는 ExportEntry 레코드 필드 예시를 제공합니다:
표 61(참고): ExportEntry 레코드 형태로 Export
구문 매핑
export문 형식
[[ExportName]]
[[ModuleRequest]]
[[ImportName]]
[[LocalName]]
export var v;
"v"
null
null
"v"
export default function f() {}
"default"
null
null
"f"
export default function () {}
"default"
null
null
"*default*"
export default 42;
"default"
null
null
"*default*"
export {x};
"x"
null
null
"x"
export {v as x};
"x"
null
null
"v"
export {x} from "mod";
"x"
"mod"
"x"
null
export {v as x} from "mod";
"x"
"mod"
"v"
null
export * from "mod";
null
"mod"
all-but-default
null
export * as ns from "mod";
"ns"
"mod"
all
null
다음 정의들은 소스 텍스트 모듈 레코드 에 필요한 구체적 메서드 및 기타
추상 연산 을 명시합니다.
16.2.1.7.1 ParseModule ( sourceText ,
realm , hostDefined )
추상 연산 ParseModule은 sourceText (ECMAScript 소스 텍스트 ),
realm (Realm Record ), 그리고
hostDefined (임의의 값)을 인자로 받으며, 소스 텍스트 모듈 레코드 또는 비어
있지 않은 List 의
SyntaxError 객체를 반환합니다. 이 연산은 sourceText 를 Module 로 파싱한 결과를 기반으로 소스
텍스트 모듈 레코드 를 생성합니다. 호출 시 다음 단계를 수행합니다:
body 를 ParseText (sourceText ,
Module )로 설정한다.
body 가 오류의 List 인 경우,
body 를 반환한다.
requestedModules 를 ModuleRequests
of body 로 설정한다.
importEntries 를 ImportEntries
of body 로 설정한다.
importedBoundNames 를 ImportedLocalNames (importEntries )로
설정한다.
indirectExportEntries 를 새로운 빈 List 로
설정한다.
localExportEntries 를 새로운 빈 List 로
설정한다.
starExportEntries 를 새로운 빈 List 로
설정한다.
exportEntries 를 ExportEntries
of body 로 설정한다.
exportEntries 의 각 ExportEntry
Record ee 에 대해 다음을 수행한다:
ee .[[ModuleRequest]] 가
null 이면:
importedBoundNames 에 ee .[[LocalName]] 이 포함되어 있지 않으면:
ee 를 localExportEntries 에 추가한다.
그 밖의 경우:
ie 를 importEntries 중 [[LocalName]] 이
ee .[[LocalName]] 인
요소로 설정한다.
ie .[[ImportName]] 이
namespace-object 이면:
참고: 이것은 import된 모듈 네임스페이스 객체의 재export이다.
ee 를 localExportEntries 에
추가한다.
그 밖의 경우:
참고: 이것은 단일 이름의 재export이다.
ExportEntry
Record { [[ModuleRequest]] :
ie .[[ModuleRequest]] , [[ImportName]] :
ie .[[ImportName]] , [[LocalName]] :
null , [[ExportName]] :
ee .[[ExportName]] }를
indirectExportEntries 에 추가한다.
그 밖의 경우 ee .[[ImportName]] 이
all-but-default 이면:
Assert : ee .[[ExportName]] 이
null 임을 확인한다.
ee 를 starExportEntries 에 추가한다.
그 밖의 경우:
ee 를 indirectExportEntries 에 추가한다.
async 를 body Contains
await로 설정한다.
Source Text Module Record
{ [[Realm]] : realm , [[Environment]] : empty , [[Namespace]] : empty , [[CycleRoot]] : empty , [[HasTLA]] : async , [[AsyncEvaluationOrder]] : unset ,
[[TopLevelCapability]] : empty ,
[[AsyncParentModules]] : « », [[PendingAsyncDependencies]] :
empty , [[Status]] :
new , [[EvaluationError]] :
empty , [[HostDefined]] :
hostDefined , [[ECMAScriptCode]] :
body , [[Context]] :
empty , [[ImportMeta]] :
empty , [[RequestedModules]] :
requestedModules , [[LoadedModules]] : « »,
[[ImportEntries]] : importEntries , [[LocalExportEntries]] : localExportEntries ,
[[IndirectExportEntries]] :
indirectExportEntries , [[StarExportEntries]] : starExportEntries ,
[[DFSAncestorIndex]] : empty }를
반환한다.
참고
구현체는 모듈 소스 텍스트를 미리 파싱하고 Early Error 조건을 분석할 수 있지만, 어떤 오류의 보고도 실제로 이 명세가 해당 소스
텍스트에 대해 ParseModule을 수행하는 시점까지는 지연되어야 합니다.
16.2.1.7.2 모듈 레코드 추상 메서드의 구현
아래는 소스 텍스트 모듈 레코드 에 대한 구체적 메서드로,
모듈 레코드 추상 메서드(표 44 에 정의됨)를
구현합니다.
16.2.1.7.2.1 GetExportedNames (
[exportStarSet ] )
소스 텍스트 모듈 레코드
module 의 GetExportedNames 구체적 메서드는 선택적 인자
exportStarSet (List of
소스 텍스트 모듈 레코드 )를 받고, 문자열
List 를 반환합니다.
호출 시 다음 절차를 수행합니다:
Assert : module .[[Status]] 가 new 가 아님을 확인한다.
exportStarSet 가 없으면 exportStarSet 를 새로운 빈 List 로
설정한다.
exportStarSet 에 module 이 포함되어 있으면:
Assert : export *
순환의 시작점에 도달함을 확인한다.
새로운 빈 List 를
반환한다.
module 을 exportStarSet 에 추가한다.
exportedNames 를 새로운 빈 List 로
설정한다.
module .[[LocalExportEntries]] 의 각
ExportEntry Record
e 에 대해:
Assert : module 이 이
export에 대해 직접 바인딩을 제공함을 확인한다.
Assert : e .[[ExportName]] 가 null 이 아님을
확인한다.
e .[[ExportName]] 을
exportedNames 에 추가한다.
module .[[IndirectExportEntries]] 의 각
ExportEntry Record
e 에 대해:
Assert : module 이 이
export에 대해 특정 바인딩을 import함을 확인한다.
Assert : e .[[ExportName]] 가 null 이 아님을
확인한다.
e .[[ExportName]] 을
exportedNames 에 추가한다.
module .[[StarExportEntries]] 의 각
ExportEntry Record
e 에 대해:
Assert : e .[[ModuleRequest]] 가 null 이
아님을 확인한다.
requestedModule 을 GetImportedModule (module ,
e .[[ModuleRequest]] )로 설정한다.
starNames 를
requestedModule .GetExportedNames(exportStarSet )로
설정한다.
starNames 의 각 n 에 대해:
n 이 "default" 가 아니면:
exportedNames 에 n 이 없으면
n 을 exportedNames 에 추가한다.
exportedNames 를 반환한다.
참고
GetExportedNames는 별표(export *) export 바인딩의 모호한 이름을 필터링하거나 예외를 발생시키지 않습니다.
16.2.1.7.2.2 ResolveExport ( exportName [ ,
resolveSet ] )
소스 텍스트 모듈 레코드
module 의 ResolveExport 구체적 메서드는 exportName (문자열)과 선택적 인자
resolveSet (필드 [[Module]] (모듈 레코드 )와 [[ExportName]] (문자열)을 가진 List of
Record ))를 받아
ResolvedBinding Record ,
null , 또는 ambiguous 를 반환합니다.
ResolveExport는 import된 바인딩을 실제 정의 모듈과 로컬 바인딩 이름으로 해결하려 시도합니다. 정의 모듈은 이 메서드가 호출된
모듈 레코드 일 수도 있고, 그 모듈이
import하는 다른 모듈일 수도 있습니다. resolveSet 파라미터는 미해결 순환 import/export 경로를 감지하기
위해 사용합니다. 특정 모듈 레코드 와
exportName 쌍이 resolveSet 에 이미 있으면 import 순환이 발견된 것입니다.
ResolveExport를 재귀적으로 호출하기 전에 module 과 exportName 쌍을
resolveSet 에 추가합니다.
정의 모듈이 발견되면 ResolvedBinding Record { [[Module]] , [[BindingName]] }를
반환합니다. 이 레코드는 요청된 export의 해결된 바인딩을 나타내지만, 네임스페이스로 export되고 로컬 바인딩이 없는 경우에는 [[BindingName]] 이 namespace 로 설정됩니다.
정의가 없거나 요청이 순환임이 발견되면 null 을 반환합니다. 요청이 모호함이 발견되면
ambiguous 를 반환합니다.
호출 시 다음 절차를 수행합니다:
Assert : module .[[Status]] 가 new 가 아님을 확인한다.
resolveSet 가 없으면 resolveSet 를 새로운 빈 List 로
설정한다.
resolveSet 의 각 Record
{ [[Module]] , [[ExportName]] } r 에 대해:
module 과 r .[[Module]] 이
동일한 모듈 레코드 이고
exportName 이 r .[[ExportName]] 이면:
Assert : 순환 import 요청임을
확인한다.
null 을 반환한다.
Record
{ [[Module]] : module , [[ExportName]] : exportName }를
resolveSet 에 추가한다.
module .[[LocalExportEntries]] 의 각
ExportEntry Record
e 에 대해:
e .[[ExportName]] 이
exportName 이면:
Assert :
module 이 이 export에 대해 직접 바인딩을 제공함을 확인한다.
ResolvedBinding
Record { [[Module]] : module , [[BindingName]] : e .[[LocalName]] }를 반환한다.
module .[[IndirectExportEntries]] 의 각
ExportEntry Record
e 에 대해:
e .[[ExportName]] 이
exportName 이면:
Assert :
e .[[ModuleRequest]] 가
null 이 아님을 확인한다.
importedModule 을 GetImportedModule (module ,
e .[[ModuleRequest]] )로
설정한다.
e .[[ImportName]] 이
all 이면:
Assert :
module 이 이 export에 대해 직접 바인딩을 제공하지 않음을
확인한다.
ResolvedBinding
Record { [[Module]] :
importedModule , [[BindingName]] :
namespace }를 반환한다.
그 밖의 경우:
Assert :
module 이 이 export에 대해 특정 바인딩을 import함을
확인한다.
Assert :
e .[[ImportName]]
문자열 임을
확인한다.
importedModule .ResolveExport(e .[[ImportName]] ,
resolveSet )을 반환한다.
exportName 이 "default" 이면:
Assert : 이 모듈에서
default export가 명시적으로 정의되지 않았음을 확인한다.
null 을 반환한다.
참고: default export는 export * from "mod"
선언으로 제공될 수 없다.
starResolution 을 null 로 설정한다.
module .[[StarExportEntries]] 의 각
ExportEntry Record
e 에 대해:
Assert : e .[[ModuleRequest]] 가 null 이
아님을 확인한다.
importedModule 을 GetImportedModule (module ,
e .[[ModuleRequest]] )로 설정한다.
resolution 을
importedModule .ResolveExport(exportName ,
resolveSet )로 설정한다.
resolution 이 ambiguous 이면
ambiguous 를 반환한다.
resolution 이 null 이 아니면:
Assert :
resolution 이 ResolvedBinding
Record 임을 확인한다.
starResolution 이 null 이면
starResolution 을 resolution 으로 설정한다.
그 밖의 경우:
Assert : 요청된
이름을 포함하는 * import가 둘 이상임을 확인한다.
resolution .[[Module]] 과
starResolution .[[Module]] 이 동일한 모듈
레코드 가 아니면
ambiguous 를 반환한다.
resolution .[[BindingName]] 이
starResolution .[[BindingName]] 과 다르고,
resolution .[[BindingName]] 또는
starResolution .[[BindingName]] 이
namespace 인 경우
ambiguous 를 반환한다.
resolution .[[BindingName]] 문자열 이고,
starResolution .[[BindingName]] 문자열 이며,
두 값이 다르면 ambiguous 를 반환한다.
starResolution 을 반환한다.
16.2.1.7.3 순환 모듈 레코드 추상 메서드의 구현
아래는 소스 텍스트 모듈 레코드 에 대한 구체적 메서드로,
순환
모듈 레코드 추상 메서드(표 46 에 정의됨)를
구현합니다.
16.2.1.7.3.1 InitializeEnvironment ( )
소스 텍스트 모듈 레코드
module 의 InitializeEnvironment 구체적 메서드는 인자를 받지 않으며, 정상 완료(normal
completion) 로 unused 를 포함하거나 throw
completion 를 반환합니다. 호출 시 다음 절차를 수행합니다:
module .[[IndirectExportEntries]] 의 각
ExportEntry Record
e 에 대해:
Assert : e .[[ExportName]] 가 null 이 아님을
확인한다.
resolution 을
module .ResolveExport(e .[[ExportName]] )로 설정한다.
resolution 이 null 또는
ambiguous 이면 SyntaxError
예외를 throw한다.
Assert : resolution 이
ResolvedBinding
Record 임을 확인한다.
Assert : module 의 모든 이름 있는
export가 해결 가능함을 확인한다.
realm 을 module .[[Realm]] 로
설정한다.
Assert : realm 이
undefined 가 아님을 확인한다.
env 를 NewModuleEnvironment (realm .[[GlobalEnv]] )로 설정한다.
module .[[Environment]] 를 env 로
설정한다.
module .[[ImportEntries]] 의 각 ImportEntry Record
in 에 대해:
importedModule 을 GetImportedModule (module ,
in .[[ModuleRequest]] )로 설정한다.
in .[[ImportName]] 이
namespace-object 이면:
namespace 를 GetModuleNamespace (importedModule )로
설정한다.
! env .CreateImmutableBinding(in .[[LocalName]] ,
true )를 수행한다.
! env .InitializeBinding(in .[[LocalName]] ,
namespace )를 수행한다.
그 밖의 경우:
resolution 을
importedModule .ResolveExport(in .[[ImportName]] )로 설정한다.
resolution 이 null 또는
ambiguous 이면
SyntaxError 예외를 throw한다.
resolution .[[BindingName]] 이
namespace 이면:
namespace 를 GetModuleNamespace (resolution .[[Module]] )로 설정한다.
! env .CreateImmutableBinding(in .[[LocalName]] ,
true )를 수행한다.
! env .InitializeBinding(in .[[LocalName]] ,
namespace )를 수행한다.
그 밖의 경우:
CreateImportBinding (env ,
in .[[LocalName]] ,
resolution .[[Module]] ,
resolution .[[BindingName]] )를 수행한다.
moduleContext 를 새로운 ECMAScript 코드 실행
컨텍스트 로 설정한다.
moduleContext 의 Function을 null 로 설정한다.
Assert : module .[[Realm]] 이 undefined 가 아님을 확인한다.
moduleContext 의 Realm 을 module .[[Realm]] 로 설정한다.
moduleContext 의 ScriptOrModule을 module 로 설정한다.
moduleContext 의 VariableEnvironment를 module .[[Environment]] 로 설정한다.
moduleContext 의 LexicalEnvironment를 module .[[Environment]] 로 설정한다.
moduleContext 의 PrivateEnvironment를 null 로 설정한다.
module .[[Context]] 를
moduleContext 로 설정한다.
moduleContext 를 실행 컨텍스트
스택 에 push한다; moduleContext 가 이제 실행 중인 실행 컨텍스트 이다.
code 를 module .[[ECMAScriptCode]] 로 설정한다.
varDeclarations 를 VarScopedDeclarations
of code 로 설정한다.
declaredVarNames 를 새로운 빈 List 로
설정한다.
varDeclarations 의 각 d 에 대해:
BoundNames
of d 의 각 dn 에 대해:
declaredVarNames 에 dn 이 없으면:
! env .CreateMutableBinding(dn ,
false )를 수행한다.
! env .InitializeBinding(dn ,
undefined )를 수행한다.
declaredVarNames 에 dn 을 추가한다.
lexDeclarations 를 LexicallyScopedDeclarations
of code 로 설정한다.
privateEnv 를 null 로 설정한다.
lexDeclarations 의 각 d 에 대해:
BoundNames
of d 의 각 dn 에 대해:
IsConstantDeclaration
of d 가 true 이면:
! env .CreateImmutableBinding(dn ,
true )를 수행한다.
그 밖의 경우:
! env .CreateMutableBinding(dn ,
false )를 수행한다.
d 가 FunctionDeclaration ,
GeneratorDeclaration ,
AsyncFunctionDeclaration ,
AsyncGeneratorDeclaration
중 하나이면:
fo 를 InstantiateFunctionObject
of d with arguments env ,
privateEnv 로 설정한다.
! env .InitializeBinding(dn ,
fo )를 수행한다.
moduleContext 를 실행 컨텍스트
스택 에서 제거한다.
unused 를 반환한다.
16.2.1.7.3.2 ExecuteModule ( [ capability ] )
소스 텍스트 모듈 레코드
module 의 ExecuteModule 구체적 메서드는 선택적 인자 capability (PromiseCapability
Record )를 받고, 정상 완료(normal
completion) 로 unused 를 포함하거나 throw
completion 를 반환합니다. 호출 시 다음 절차를 수행합니다:
moduleContext 를 새로운 ECMAScript 코드 실행
컨텍스트 로 설정한다.
moduleContext 의 Function을 null 로 설정한다.
moduleContext 의 Realm 을 module .[[Realm]] 로 설정한다.
moduleContext 의 ScriptOrModule을 module 로 설정한다.
Assert : module 이 링크되고 모듈 환경
내 선언이 인스턴스화되었음을 확인한다.
moduleContext 의 VariableEnvironment를 module .[[Environment]] 로 설정한다.
moduleContext 의 LexicalEnvironment를 module .[[Environment]] 로 설정한다.
실행 중인 실행 컨텍스트 를 일시
중지한다.
module .[[HasTLA]] 가
false 이면:
Assert : capability 가
없음을 확인한다.
moduleContext 를 실행 컨텍스트
스택 에 push한다; moduleContext 가 이제
실행 중인 실행
컨텍스트 이다.
result 를 Completion (Evaluation of
module .[[ECMAScriptCode]] )로
설정한다.
moduleContext 를 일시 중지시키고, 실행 컨텍스트 스택 에서
제거한다.
실행 컨텍스트 스택 의 맨
위에 있는 컨텍스트를 실행 중인 실행
컨텍스트 로 재개한다.
result 가 비정상
완료(abrupt completion) 이면:
? result 를 반환한다.
그 밖의 경우:
Assert : capability 가
PromiseCapability
Record 임을 확인한다.
AsyncBlockStart (capability ,
module .[[ECMAScriptCode]] ,
moduleContext )를 수행한다.
unused 를 반환한다.
16.2.1.8 합성 모듈 레코드
합성 모듈 레코드 는 명세에 의해 정의된 모듈에 대한 정보를
나타내는 데 사용됩니다. export된 이름들은 생성 시에 정적으로 정의되며, 해당 값들은 SetSyntheticModuleExport 를 사용하여
시간이 지나면서 변경될 수 있습니다. import나 의존성이 없습니다.
참고
합성 모듈 레코드는 JSON 모듈이나 CSS 모듈 등 다양한 타입의 모듈을 정의하는 데 사용할 수 있습니다.
표 43 에 정의된 필드 외에도, 합성 모듈 레코드는
표 62 에 나열된 추가 필드를 가집니다.
표 62: 합성 모듈 레코드 의 추가 필드
16.2.1.8.1 CreateDefaultExportSyntheticModule (
defaultExport )
추상 연산 CreateDefaultExportSyntheticModule은 defaultExport (ECMAScript 언어 값 )을 인자로 받아
합성 모듈 레코드 를 반환합니다. 이 연산은
defaultExport 를 default export로 갖는 합성 모듈 레코드 를 생성합니다. 호출 시 다음
절차를 수행합니다:
realm 을 현재 Realm Record 로 설정한다.
setDefaultExport 를 파라미터(module )를 가지며
defaultExport 를 캡처하는 새로운 추상 클로저(Abstract
Closure) 로 설정하여, 호출 시 다음을 수행한다:
SetSyntheticModuleExport (module ,
"default" , defaultExport )를 수행한다.
NormalCompletion (unused )을
반환한다.
다음과 같은 합성 모듈 레코드 를 반환한다: {
[[Realm]] : realm , [[Environment]] : empty , [[Namespace]] : empty , [[HostDefined]] : undefined , [[ExportNames]] : « "default" », [[EvaluationSteps]] : setDefaultExport }.
16.2.1.8.2 ParseJSONModule ( source )
추상 연산 ParseJSONModule은 source (문자열)를 인자로 받아 정상 완료(normal
completion) 로 합성 모듈 레코드 를
포함하거나, throw
completion 를 반환합니다. 호출 시 다음 절차를 수행합니다:
json 을 ? ParseJSON (source )로 설정한다.
CreateDefaultExportSyntheticModule (json )을
반환한다.
16.2.1.8.3 SetSyntheticModuleExport ( module ,
exportName , exportValue )
추상 연산 SetSyntheticModuleExport는 module (합성 모듈 레코드 ),
exportName (문자열), exportValue (ECMAScript 언어 값 )을 인자로 받아
unused 를 반환합니다. 이 연산은 합성 모듈 레코드 의 기존 export에 대한 값을
설정하거나 변경할 수 있습니다. 호출 시 다음 절차를 수행합니다:
Assert :
module .[[ExportNames]] 에
exportName 이 포함되어 있음을 확인한다.
envRec 을 module .[[Environment]] 로
설정한다.
Assert :
envRec 가 empty 가 아님을 확인한다.
envRec .SetMutableBinding(exportName ,
exportValue , true )를 수행한다.
unused 를 반환한다.
16.2.1.8.4 모듈 레코드 추상 메서드의 구현
아래는 합성 모듈 레코드 에 대한 구체적 메서드로,
모듈 레코드 추상 메서드(표 44 에 정의됨)를
구현합니다.
16.2.1.8.4.1 LoadRequestedModules ( )
합성 모듈 레코드
module 의 LoadRequestedModules 구체적 메서드는 인자를 받지 않으며 Promise를 반환합니다. 호출 시 다음
절차를 수행합니다:
! PromiseResolve (%Promise% ,
undefined )를 반환한다.
참고
16.2.1.8.4.2 GetExportedNames ( )
합성 모듈 레코드
module 의 GetExportedNames 구체적 메서드는 인자를 받지 않으며, 문자열 List 를 반환합니다.
호출 시 다음 절차를 수행합니다:
module .[[ExportNames]] 를 반환한다.
16.2.1.8.4.3 ResolveExport ( exportName )
합성 모듈 레코드
module 의 ResolveExport 구체적 메서드는 exportName (문자열)을 인자로 받아
ResolvedBinding Record 또는
null 을 반환합니다. 호출 시 다음 절차를 수행합니다:
module .[[ExportNames]] 에
exportName 이 없으면 null 을 반환한다.
ResolvedBinding Record
{ [[Module]] : module , [[BindingName]] : exportName }를 반환한다.
16.2.1.8.4.4 Link ( )
합성 모듈 레코드
module 의 Link 구체적 메서드는 인자를 받지 않으며 정상 완료(normal
completion) 로 unused 를 반환합니다. 호출 시 다음
절차를 수행합니다:
realm 을 module .[[Realm]] 로
설정한다.
env 을 NewModuleEnvironment (realm .[[GlobalEnv]] )로 설정한다.
module .[[Environment]] 를 env 로
설정한다.
module .[[ExportNames]] 의 각 문자열
exportName 에 대해:
! env .CreateMutableBinding(exportName ,
false )를 수행한다.
! env .InitializeBinding(exportName ,
undefined )를 수행한다.
NormalCompletion (unused )을
반환한다.
16.2.1.8.4.5 Evaluate ( )
합성 모듈 레코드
module 의 Evaluate 구체적 메서드는 인자를 받지 않으며 Promise를 반환합니다. 호출 시 다음 절차를 수행합니다:
moduleContext 를 새로운 ECMAScript 코드 실행
컨텍스트 로 설정한다.
moduleContext 의 Function을 null 로 설정한다.
moduleContext 의 Realm 을 module .[[Realm]] 로 설정한다.
moduleContext 의 ScriptOrModule을 module 로 설정한다.
moduleContext 의 VariableEnvironment를 module .[[Environment]] 로 설정한다.
moduleContext 의 LexicalEnvironment를 module .[[Environment]] 로 설정한다.
실행 중인 실행 컨텍스트 를 일시
중지한다.
moduleContext 를 실행 컨텍스트
스택 에 push한다; moduleContext 가 이제 실행 중인 실행 컨텍스트 이다.
steps 를 module .[[EvaluationSteps]] 로 설정한다.
result 를 Completion (steps (module ))로
설정한다.
moduleContext 를 일시 중지시키고, 실행 컨텍스트 스택 에서 제거한다.
실행 컨텍스트 스택 의 맨 위에 있는
컨텍스트를 실행 중인 실행 컨텍스트 로
재개한다.
pc 를 ! NewPromiseCapability (%Promise% )로 설정한다.
IfAbruptRejectPromise (result ,
pc )를 수행한다.
! Call (pc .[[Resolve]] , undefined , «
undefined »)를 수행한다.
pc .[[Promise]] 를 반환한다.
16.2.1.9 GetImportedModule ( referrer ,
request )
추상 연산 GetImportedModule은 referrer (순환 모듈 레코드 )와
request (ModuleRequest Record )를 인자로 받고 모듈 레코드 를 반환합니다. 호출 시 다음 절차를 수행합니다:
records 를 referrer .[[LoadedModules]] 에 있는 각 LoadedModuleRequest Record
r 중 ModuleRequestsEqual (r ,
request )가 true 인 것만 모은 List 로 설정한다.
Assert :
records 는 정확히 하나의 요소만을 가져야 하며, 이는 LoadRequestedModules가
referrer 에서 성공적으로 완료된 후 이 추상 연산이 호출되기 때문이다.
record 를 records 의 유일한 요소로 설정한다.
record .[[Module]] 를 반환한다.
16.2.1.10 HostLoadImportedModule ( referrer ,
moduleRequest , hostDefined , payload )
호스트 정의
추상 연산 HostLoadImportedModule은 referrer (스크립트 레코드 , 순환 모듈
레코드 , 또는 Realm Record ),
moduleRequest (ModuleRequest Record ),
hostDefined (임의 값), payload (GraphLoadingState
Record 또는 PromiseCapability
Record )를 인자로 받아 unused 를 반환합니다.
참고 1
referrer 가 Realm Record 가 될 수 있는 예시는 웹 브라우저
호스트 에서 발생합니다.
사용자가 아래와 같은 컨트롤을 클릭할 때
<button type="button" onclick="import('./foo.mjs')">Click me</button>
해당 시점에는 활성 스크립트나 모듈 이 존재하지 않습니다. 좀 더
일반적으로, 호스트 가
실행 컨텍스트 를
null ScriptOrModule 구성요소로 실행 컨텍스트 스택 에 push하는 모든 상황에서
발생할 수 있습니다.
HostLoadImportedModule의 구현체는 아래 요구사항을 따라야 합니다:
호스트
환경 은 FinishLoadingImportedModule (referrer ,
moduleRequest , payload , result )를 수행해야 하며,
result 는 로드된 모듈 레코드 를 포함하는 정상 완료(normal
completion) 또는 throw completion
중 하나이어야 하며, 동기 또는 비동기적으로 처리될 수 있습니다.
이 연산이 두 쌍(referrer , moduleRequest )에 대해 여러 번 호출되고:
첫 번째 referrer 가 두 번째 referrer 와 동일할 것
ModuleRequestsEqual (첫 번째
moduleRequest , 두 번째 moduleRequest )가
true 일 것
그리고 FinishLoadingImportedModule (referrer ,
moduleRequest , payload , result )를 result 가
정상 완료(normal
completion) 일 때 수행하면, 이후 반복 호출에서도 항상 동일한 result 로
호출해야 합니다.
moduleRequest .[[Attributes]] 에 entry 가
존재하고 entry .[[Key]] 가 "type" 이고
entry .[[Value]] 가 "json" 인 경우,
호스트
환경 이 FinishLoadingImportedModule (referrer ,
moduleRequest , payload , result )를 수행할 때,
result 는 ParseJSONModule 의 호출 결과로 반환된
Completion
Record 이거나 throw
completion 이어야 합니다.
연산은 payload 를 FinishLoadingImportedModule 에
전달해야 하는 불투명 값으로 취급해야 합니다.
실제 처리 과정은 호스트
정의 이지만, 일반적으로 적절한 모듈 레코드 를 로드하기 위한 필요한
모든 I/O 작업을 수행합니다. 여러 (referrer , moduleRequest .[[Specifier]] , moduleRequest .[[Attributes]] ) 삼중쌍이 동일한 모듈 레코드 인스턴스에 매핑될 수 있습니다. 실제 매핑
방식은 호스트
정의 이지만, 일반적으로 매핑 과정에서 specifier 에 대한 정규화 프로세스가 적용됩니다. 일반적인
정규화 과정에는 상대 경로 및 축약 경로 지정자의 확장이 포함될 수 있습니다.
참고 2
위 요구사항은 호스트 가
type: "json"으로 import할 때 JSON 모듈을 지원해야 함을 의미하지만(그리고
HostLoadImportedModule이 정상적으로 완료될 경우), type: "json" 없이 import할 때 JSON
모듈을 지원하는 것을 금지하지는 않습니다.
16.2.1.11 FinishLoadingImportedModule ( referrer ,
moduleRequest , payload , result )
FinishLoadingImportedModule 추상 연산은 referrer (스크립트 레코드 , 순환 모듈
레코드 , 또는 Realm Record ),
moduleRequest (ModuleRequest Record ),
payload (GraphLoadingState Record 또는
PromiseCapability Record ),
result (정상 완료(normal
completion) 로 모듈 레코드 를 포함하거나
throw completion )를
인자로 받아 unused 를 반환합니다. 호출 시 다음 절차를 수행합니다:
result 가 정상 완료(normal
completion) 이면:
referrer .[[LoadedModules]] 에 LoadedModuleRequest
Record record 가 존재하고 ModuleRequestsEqual (record ,
moduleRequest )가 true 이면:
Assert : record .[[Module]] 과 result .[[Value]] 는 동일한 모듈 레코드 임을
확인한다.
그 밖의 경우:
LoadedModuleRequest
Record { [[Specifier]] : moduleRequest .[[Specifier]] , [[Attributes]] :
moduleRequest .[[Attributes]] ,
[[Module]] : result .[[Value]] }를 referrer .[[LoadedModules]] 에 추가한다.
payload 가 GraphLoadingState Record 이면:
ContinueModuleLoading (payload ,
result )를 수행한다.
그 밖의 경우:
ContinueDynamicImport (payload ,
result )를 수행한다.
unused 를 반환한다.
16.2.1.12 AllImportAttributesSupported ( attributes )
AllImportAttributesSupported 추상 연산은 attributes (List of ImportAttribute Records )를 인자로 받아 불리언
값을 반환합니다. 호출 시 다음 절차를 수행합니다:
supported 를 HostGetSupportedImportAttributes ()로
설정한다.
attributes 의 각 ImportAttribute Record
attribute 에 대해:
supported 에 attribute .[[Key]] 가
없으면 false 를 반환한다.
true 를 반환한다.
16.2.1.12.1 HostGetSupportedImportAttributes ( )
HostGetSupportedImportAttributes 호스트 정의 추상 연산은 인자를 받지 않으며, 문자열의 List 를 반환합니다.
호스트
환경 이 지원하는 import attribute 키를 지정할 수 있게 합니다. 지원되는 키의 attribute만
호스트 에 제공됩니다.
HostGetSupportedImportAttributes의 구현체는 아래 요구사항을 따라야 합니다:
반환값은 지원되는 attribute를 나타내는 문자열의 List 여야 한다.
이 연산이 호출될 때마다 동일한 List 와 동일한 순서의
내용을 반환해야 한다.
HostGetSupportedImportAttributes의 기본 구현은 새로운 빈 List 를 반환하는 것이다.
참고
지원되지 않는 attribute를 호스트에 전달하고 호스트가 원하는 것만 처리하게 하는 대신, 호스트가
지원하는 import attribute를 명시적으로 지정하도록 요구하는 목적은 서로 다른
호스트 들 사이에서 지원되지 않는 attribute가 일관되게
처리되도록 하기 위함이다.
16.2.1.13 GetModuleNamespace ( module )
GetModuleNamespace 추상 연산은 module (모듈 레코드 의 구체적 하위 클래스
인스턴스)을 인자로 받아 모듈 네임스페이스 객체(Module Namespace Object)를 반환합니다. 이 객체는 module 의 export를
나타내며, 처음 요청 시 지연 생성되고, 이후 요청을 위해 module .[[Namespace]] 에
저장됩니다. 호출 시 다음 절차를 수행합니다:
Assert :
module 이 순환 모듈 레코드 인 경우
module .[[Status]] 는 new 또는
unlinked 가 아님을 확인한다.
namespace 를 module .[[Namespace]] 로
설정한다.
namespace 가 empty 이면:
exportedNames 를 module .GetExportedNames()로 설정한다.
unambiguousNames 를 새로운 빈 List 로
설정한다.
exportedNames 의 각 name 에 대해:
resolution 을
module .ResolveExport(name )로 설정한다.
resolution 이 ResolvedBinding
Record 이면, name 을
unambiguousNames 에 추가한다.
namespace 를 ModuleNamespaceCreate (module ,
unambiguousNames )로 설정한다.
namespace 를 반환한다.
참고
GetModuleNamespace는 예외를 throw하지 않습니다. 대신, 해결 불가능한 이름은 네임스페이스에서 단순히 제외됩니다. 실제 linking
오류는 나중에 발생하며, 단 ambiguous star export로만 구성되어 있고 명시적으로 요청되지 않을 경우에는 linking 오류가 나지 않을
수 있습니다.
16.2.1.14 런타임 의미론: 평가(Evaluation)
Module : [empty]
undefined 를 반환한다.
ModuleBody : ModuleItemList
result 를 Completion (Evaluation of ModuleItemList )로 설정한다.
result 가 정상 완료(normal
completion) 이고 result .[[Value]] 가 empty 이면:
undefined 를 반환한다.
? result 를 반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
sl 를 ? Evaluation of
ModuleItemList 로
설정한다.
s 를 Completion (Evaluation of ModuleItem )로 설정한다.
? UpdateEmpty (s ,
sl )를 반환한다.
참고
ModuleItem : ImportDeclaration
empty 를 반환한다.
16.2.2 임포트
문법
ImportDeclaration
:
import
ImportClause
FromClause
WithClause opt
;
import
ModuleSpecifier
WithClause opt
;
ImportClause :
ImportedDefaultBinding
NameSpaceImport
NamedImports
ImportedDefaultBinding
,
NameSpaceImport
ImportedDefaultBinding
,
NamedImports
ImportedDefaultBinding
:
ImportedBinding
NameSpaceImport :
*
as
ImportedBinding
NamedImports :
{
}
{
ImportsList
}
{
ImportsList
,
}
FromClause :
from
ModuleSpecifier
ImportsList :
ImportSpecifier
ImportsList
,
ImportSpecifier
ImportSpecifier :
ImportedBinding
ModuleExportName
as
ImportedBinding
ModuleSpecifier :
StringLiteral
ImportedBinding :
BindingIdentifier [~Yield,
+Await]
WithClause :
with
{
}
with
{
WithEntries
,opt
}
WithEntries :
AttributeKey
:
StringLiteral
AttributeKey
:
StringLiteral
,
WithEntries
AttributeKey :
IdentifierName
StringLiteral
16.2.2.1 정적 의미론: 조기 오류
ModuleItem : ImportDeclaration
WithClause :
with
{
WithEntries
,opt
}
16.2.2.2 정적 의미론: ImportEntries
구문 지향 연산
ImportEntries는 인자가 없으며 List 형태의
ImportEntry Records 를 반환합니다. 다음의 각 생산 규칙에
대해 조각별로 정의됩니다:
Module : [empty]
새 빈 List 를 반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
entries1 을 ImportEntries of
ModuleItemList 로
한다.
entries2 를 ImportEntries of
ModuleItem 로 한다.
entries1 과 entries2 의 list-concatenation 을
반환한다.
ModuleItem :
ExportDeclaration
StatementListItem
새 빈 List 를 반환한다.
ImportDeclaration
:
import
ImportClause
FromClause
WithClause opt
;
module 을 ModuleRequests of
ImportDeclaration 의 유일한 요소로 한다.
ImportEntriesForModule
of
ImportClause 에
module 인자를 넘겨 반환한다.
ImportDeclaration
:
import
ModuleSpecifier
WithClause opt
;
새 빈 List 를 반환한다.
16.2.2.3 정적 의미론: ImportEntriesForModule
구문 지향 연산
ImportEntriesForModule은 module ( ModuleRequest Record ) 인자를
받고 List 형태의 ImportEntry
Records 를 반환합니다. 다음의 각 생산 규칙에 대해 조각별로 정의됩니다:
ImportClause :
ImportedDefaultBinding
,
NameSpaceImport
entries1 을 ImportEntriesForModule
of ImportedDefaultBinding 에
module 인자를 넘겨서 얻는다.
entries2 를 ImportEntriesForModule
of NameSpaceImport 에 module
인자를 넘겨서 얻는다.
entries1 과 entries2 의 list-concatenation 을
반환한다.
ImportClause :
ImportedDefaultBinding
,
NamedImports
entries1 을 ImportEntriesForModule
of ImportedDefaultBinding 에
module 인자를 넘겨서 얻는다.
entries2 를 ImportEntriesForModule
of NamedImports 에
module 인자를 넘겨서 얻는다.
entries1 과 entries2 의 list-concatenation 을
반환한다.
ImportedDefaultBinding
: ImportedBinding
localName 을 BoundNames of ImportedBinding 의
유일한 요소로 한다.
defaultEntry 를 ImportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : "default" , [[LocalName]] : localName }로 한다.
« defaultEntry »를 반환한다.
NameSpaceImport
:
*
as
ImportedBinding
localName 을 StringValue of
ImportedBinding 로 한다.
entry 를 ImportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : namespace-object ,
[[LocalName]] : localName }로 한다.
« entry »를 반환한다.
NamedImports :
{
}
새 빈 List 를 반환한다.
ImportsList :
ImportsList
,
ImportSpecifier
specs1 을 ImportEntriesForModule
of ImportsList 에
module 인자를 넘겨서 얻는다.
specs2 를 ImportEntriesForModule
of ImportSpecifier 에 module
인자를 넘겨서 얻는다.
specs1 과 specs2 의 list-concatenation 을
반환한다.
ImportSpecifier
: ImportedBinding
localName 을 BoundNames of ImportedBinding 의
유일한 요소로 한다.
entry 를 ImportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : localName , [[LocalName]] : localName }로 한다.
« entry »를 반환한다.
ImportSpecifier
:
ModuleExportName
as
ImportedBinding
importName 을 StringValue of
ModuleExportName 로 한다.
localName 을 StringValue of
ImportedBinding 로 한다.
entry 를 ImportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : importName , [[LocalName]] : localName }로 한다.
« entry »를 반환한다.
16.2.2.4 정적 의미론: WithClauseToAttributes
구문 지향 연산
WithClauseToAttributes는 인자를 받지 않으며,
List 형태의 ImportAttribute Records 를 반환합니다. 아래의 각
생산 규칙별로 조각별로 정의됩니다:
WithClause :
with
{
}
새 빈 List 를 반환한다.
WithClause :
with
{
WithEntries
,opt
}
attributes 를 WithClauseToAttributes of
WithEntries 로 한다.
attributes 를 각 [[Key]] 필드의 값을 UTF-16 코드 유닛 시퀀스로
취급하여,
그 사전식(lexicographic) 순서대로 정렬한다. 참고: 이 정렬은 호스트 가
속성 열거 순서에 따라 동작을 변경하는 것이 금지됨을 관찰할 수 있을 뿐입니다.
attributes 를 반환한다.
WithEntries :
AttributeKey
:
StringLiteral
key 를 PropName of AttributeKey 로 한다.
entry 를 ImportAttribute Record { [[Key]] : key ,
[[Value]] : SV of StringLiteral }로 한다.
« entry »를 반환한다.
WithEntries :
AttributeKey
:
StringLiteral
,
WithEntries
key 를 PropName of AttributeKey 로 한다.
entry 를 ImportAttribute Record { [[Key]] : key ,
[[Value]] : SV of StringLiteral }로 한다.
rest 를 WithClauseToAttributes of
WithEntries 로 한다.
« entry »와 rest 의 list-concatenation 을
반환한다.
16.2.3 내보내기
문법
ExportDeclaration
:
export
ExportFromClause
FromClause
WithClause opt
;
export
NamedExports
;
export
VariableStatement [~Yield,
+Await]
export
Declaration [~Yield,
+Await]
export
default
HoistableDeclaration [~Yield,
+Await, +Default]
export
default
ClassDeclaration [~Yield,
+Await, +Default]
export
default
[lookahead ∉ { function , async
[no LineTerminator here]
function , class }]
AssignmentExpression [+In,
~Yield, +Await]
;
ExportFromClause :
*
*
as
ModuleExportName
NamedExports
NamedExports :
{
}
{
ExportsList
}
{
ExportsList
,
}
ExportsList :
ExportSpecifier
ExportsList
,
ExportSpecifier
ExportSpecifier :
ModuleExportName
ModuleExportName
as
ModuleExportName
16.2.3.1 정적 의미론: 조기 오류
ExportDeclaration
:
export
NamedExports
;
참고
16.2.3.2 정적 의미론: ExportedBindings
구문 지향 연산
ExportedBindings는 인자를 받지 않으며 List 형태의
문자열을 반환합니다.
참고
ExportedBindings는 Module 의
ExportedNames 와
명시적으로 연결된 로컬 바인딩 이름입니다.
아래의 생산 규칙별로 조각별로 정의됩니다:
ModuleItemList :
ModuleItemList
ModuleItem
names1 을 ExportedBindings
of ModuleItemList 로 한다.
names2 를 ExportedBindings
of ModuleItem 로 한다.
names1 과 names2 의 list-concatenation 을
반환한다.
ModuleItem :
ImportDeclaration
StatementListItem
새 빈 List 를 반환한다.
ExportDeclaration
:
export
ExportFromClause
FromClause
WithClause opt
;
새 빈 List 를 반환한다.
ExportDeclaration
:
export
NamedExports
;
ExportedBindings
of NamedExports 를
반환한다.
ExportDeclaration
:
export
VariableStatement
BoundNames of VariableStatement 를 반환한다.
ExportDeclaration
:
export
Declaration
BoundNames of Declaration 를 반환한다.
ExportDeclaration
:
export
default
HoistableDeclaration
export
default
ClassDeclaration
export
default
AssignmentExpression
;
이 BoundNames of ExportDeclaration 를 반환한다.
NamedExports :
{
}
새 빈 List 를 반환한다.
ExportsList :
ExportsList
,
ExportSpecifier
names1 을 ExportedBindings
of ExportsList 로 한다.
names2 를 ExportedBindings
of ExportSpecifier 로 한다.
names1 과 names2 의 list-concatenation 을
반환한다.
ExportSpecifier
: ModuleExportName
ModuleExportName 의 StringValue 만을 요소로
가지는 List 를 반환한다.
ExportSpecifier
:
ModuleExportName
as
ModuleExportName
첫 번째 ModuleExportName 의 StringValue 만을 요소로
가지는 List 를 반환한다.
16.2.3.3 정적 의미론: ExportedNames
구문 지향 연산
ExportedNames는 인자를 받지 않으며 List 형태의
문자열을 반환합니다.
참고
ExportedNames는 Module 가
명시적으로 자신의 로컬 바인딩 이름 중 하나에 매핑한 외부적으로 보이는 이름들입니다.
아래의 생산 규칙별로 조각별로 정의됩니다:
ModuleItemList :
ModuleItemList
ModuleItem
names1 을 ExportedNames of
ModuleItemList 로
한다.
names2 를 ExportedNames of
ModuleItem 로 한다.
names1 과 names2 의 리스트 연결 을 반환한다.
ModuleItem : ExportDeclaration
ExportedNames of
ExportDeclaration 를 반환한다.
ModuleItem :
ImportDeclaration
StatementListItem
새 빈 List 를 반환한다.
ExportDeclaration
:
export
ExportFromClause
FromClause
WithClause opt
;
ExportedNames of
ExportFromClause 를 반환한다.
ExportFromClause
: *
새 빈 List 를 반환한다.
ExportFromClause
:
*
as
ModuleExportName
ModuleExportName 의 StringValue 만을 요소로
가지는 List 를 반환한다.
ExportFromClause
: NamedExports
ExportedNames of
NamedExports 를
반환한다.
ExportDeclaration
:
export
VariableStatement
BoundNames of VariableStatement 를 반환한다.
ExportDeclaration
:
export
Declaration
BoundNames of Declaration 를 반환한다.
ExportDeclaration
:
export
default
HoistableDeclaration
export
default
ClassDeclaration
export
default
AssignmentExpression
;
« "default" »를 반환한다.
NamedExports :
{
}
새 빈 List 를 반환한다.
ExportsList :
ExportsList
,
ExportSpecifier
names1 을 ExportedNames of
ExportsList 로 한다.
names2 를 ExportedNames of
ExportSpecifier 로 한다.
names1 과 names2 의 리스트 연결 을 반환한다.
ExportSpecifier
: ModuleExportName
ModuleExportName 의 StringValue 만을 요소로
가지는 List 를 반환한다.
ExportSpecifier
:
ModuleExportName
as
ModuleExportName
두 번째 ModuleExportName 의 StringValue 만을 요소로
가지는 List 를 반환한다.
16.2.3.4 정적 의미론: ExportEntries
구문 지향 연산
ExportEntries는 인자를 받지 않으며 List 형태의
ExportEntry Records 를 반환합니다. 아래의 각 생산 규칙별로
조각별로 정의됩니다:
Module : [empty]
새 빈 List 를 반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
entries1 을 ExportEntries of
ModuleItemList 로
한다.
entries2 를 ExportEntries of
ModuleItem 로 한다.
entries1 과 entries2 의 리스트 연결 을 반환한다.
ModuleItem :
ImportDeclaration
StatementListItem
새 빈 List 를 반환한다.
ExportDeclaration
:
export
ExportFromClause
FromClause
WithClause opt
;
module 을 ModuleRequests of
ExportDeclaration 의 유일한 요소로 한다.
ExportEntriesForModule
of ExportFromClause 에
module 인자를 넘겨 반환한다.
ExportDeclaration
:
export
NamedExports
;
ExportEntriesForModule
of NamedExports 에
null 인자를 넘겨 반환한다.
ExportDeclaration
:
export
VariableStatement
entries 를 새 빈 List 로 한다.
names 를 BoundNames of VariableStatement 로 한다.
names 의 각 요소 name 에 대해,
ExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : name , [[ExportName]] : name }를
entries 에 추가한다.
entries 를 반환한다.
ExportDeclaration
:
export
Declaration
entries 를 새 빈 List 로 한다.
names 를 BoundNames of Declaration 로 한다.
names 의 각 요소 name 에 대해,
ExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : name , [[ExportName]] : name }를
entries 에 추가한다.
entries 를 반환한다.
ExportDeclaration
:
export
default
HoistableDeclaration
names 를 BoundNames of HoistableDeclaration 로 한다.
localName 을 names 의 유일한 요소로 한다.
List 의 유일한 요소로
ExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : localName , [[ExportName]] : "default" }를 반환한다.
ExportDeclaration
:
export
default
ClassDeclaration
names 를 BoundNames of ClassDeclaration 로
한다.
localName 을 names 의 유일한 요소로 한다.
List 의 유일한 요소로
ExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : localName , [[ExportName]] : "default" }를 반환한다.
ExportDeclaration
:
export
default
AssignmentExpression
;
entry 를 ExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : "*default*" , [[ExportName]] : "default" }로 한다.
« entry »를 반환한다.
참고
"*default*" 는 익명 기본 내보내기 값에 대해 이 명세에서 합성 이름으로 사용됩니다. 자세한 내용은
이 노트 를 참조하세요.
16.2.3.5 정적 의미론: ExportEntriesForModule
구문 지향 연산
ExportEntriesForModule은 module (ModuleRequest Record 또는
null ) 인자를 받고 List 형태의
ExportEntry Records 를 반환합니다. 아래 생산 규칙별로
조각별로 정의됩니다:
ExportFromClause
: *
entry 를 ExportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : all-but-default , [[LocalName]] : null , [[ExportName]] : null }로 한다.
« entry »를 반환한다.
ExportFromClause
:
*
as
ModuleExportName
exportName 을 StringValue of
ModuleExportName 로 한다.
entry 를 ExportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : all , [[LocalName]] : null , [[ExportName]] : exportName }로 한다.
« entry »를 반환한다.
NamedExports :
{
}
새 빈 List 를 반환한다.
ExportsList :
ExportsList
,
ExportSpecifier
specs1 을 ExportEntriesForModule
of ExportsList 에
module 인자를 넘겨서 얻는다.
specs2 를 ExportEntriesForModule
of ExportSpecifier 에 module
인자를 넘겨서 얻는다.
specs1 과 specs2 의 리스트 연결 을 반환한다.
ExportSpecifier
: ModuleExportName
sourceName 을 StringValue of
ModuleExportName 로 한다.
만약 module 이 null 이면,
localName 을 sourceName 으로 한다.
importName 을 null 로 한다.
그 외에는,
localName 을 null 로 한다.
importName 을 sourceName 으로 한다.
List 의 유일한 요소로
ExportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : importName , [[LocalName]] : localName , [[ExportName]] : sourceName }를 반환한다.
ExportSpecifier
:
ModuleExportName
as
ModuleExportName
sourceName 을 첫 번째 ModuleExportName 의 StringValue 로 한다.
exportName 을 두 번째 ModuleExportName 의 StringValue 로 한다.
만약 module 이 null 이면,
localName 을 sourceName 으로 한다.
importName 을 null 로 한다.
그 외에는,
localName 을 null 로 한다.
importName 을 sourceName 으로 한다.
List 의 유일한 요소로
ExportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : importName , [[LocalName]] : localName , [[ExportName]] : exportName }를 반환한다.
16.2.3.6 정적 의미론: ReferencedBindings
구문 지향 연산
ReferencedBindings는 인자를 받지 않으며 List 형태의
파싱
노드 를 반환합니다. 아래의 각 생산 규칙별로 조각별로 정의됩니다:
NamedExports :
{
}
새 빈 List 를 반환한다.
ExportsList :
ExportsList
,
ExportSpecifier
names1 을 ReferencedBindings
of ExportsList 로 한다.
names2 를 ReferencedBindings
of ExportSpecifier 로 한다.
names1 과 names2 의 리스트 연결 을 반환한다.
ExportSpecifier
:
ModuleExportName
as
ModuleExportName
첫 번째 ReferencedBindings
of ModuleExportName 를 반환한다.
ModuleExportName
: IdentifierName
IdentifierName 만을
요소로 가지는 List 를 반환한다.
ModuleExportName
: StringLiteral
StringLiteral 만을
요소로 가지는 List 를 반환한다.
16.2.3.7 실행 시 의미론: 평가
ExportDeclaration
:
export
ExportFromClause
FromClause
WithClause opt
;
export
NamedExports
;
empty 를 반환한다.
ExportDeclaration
:
export
VariableStatement
? Evaluation of VariableStatement 를 반환한다.
ExportDeclaration
:
export
Declaration
? Evaluation of Declaration 를 반환한다.
ExportDeclaration
:
export
default
HoistableDeclaration
? Evaluation of HoistableDeclaration 를 반환한다.
ExportDeclaration
:
export
default
ClassDeclaration
value 를 ? BindingClassDeclarationEvaluation of
ClassDeclaration 로 한다.
className 을 BoundNames of ClassDeclaration 의
유일한 요소로 한다.
만약 className 이 "*default*" 이라면,
env 를 실행 중인 실행
컨텍스트 의 LexicalEnvironment로 한다.
? InitializeBoundName ("*default*" ,
value , env )를 수행한다.
empty 를 반환한다.
ExportDeclaration
:
export
default
AssignmentExpression
;
IsAnonymousFunctionDefinition (AssignmentExpression )이
true 이면,
value 를 ? NamedEvaluation of AssignmentExpression 에
"default" 인자를 넘겨서 얻는다.
그 외에는,
rhs 를 ? Evaluation
of AssignmentExpression 로
한다.
value 를 ? GetValue (rhs )로 한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
? InitializeBoundName ("*default*" ,
value , env )를 수행한다.
empty 를 반환한다.
17 오류 처리 및 언어 확장
구현체는 대부분의 오류를 관련 ECMAScript 언어 구성요소가 평가되는 시점에 보고해야 한다. 조기 오류 란, 오류가 포함된 Script 내의 어떤 구성요소도 평가되기 전에 감지하고 보고할 수 있는 오류를 의미한다. 조기 오류 가 있으면 해당 구성요소의 평가가
이루어지지 않는다. 구현체는 Script 를 ParseScript 로 파싱하는 과정에서
조기 오류 를 반드시 보고해야 한다.
Module 내의 조기 오류 는 해당 Module 이 평가될 시점에 보고되며, Module 은 절대 초기화되지 않는다. eval 코드의 조기 오류 는 eval이
호출된 시점에 보고되며, eval 코드의 평가를 방지한다. 조기 오류 가 아닌 모든 오류는 런타임 오류다.
구현체는 이 명세의 “정적 의미론: 조기 오류” 하위 절에 나열된 조건이 발생하면 반드시 조기 오류 로 보고해야 한다.
구현체는 컴파일러가 어떤 구성요소가 어떤 상황에서도 오류 없이 실행될 수 없음을 증명할 수 있더라도, 다른 종류의 오류를 조기 오류 로 처리해서는 안 된다. 이러한 경우에는 조기 경고를 표시할 수 있지만,
관련 구성요소가 실제로 실행되기 전까지는 오류를 보고해서는 안 된다.
구현체는 다음을 제외하고 모든 오류를 명세된 대로 보고해야 한다:
17.1 에서 제한한 경우를 제외하고, 호스트 또는 구현체는 Script 문법, Module 문법, 그리고 정규식 패턴 또는 플래그 문법을 확장할 수 있다. 이를 허용하기 위해
eval 호출, 정규식 리터럴 사용, Function 또는 RegExp 생성자 사용 등 SyntaxError 를 던질 수 있는 모든 동작은,
스크립트 문법 또는 정규식 패턴/플래그 문법의 호스트
정의 확장을 만났을 때 SyntaxError 를 던지는 대신 호스트 정의 동작을 보일 수 있다.
17.1 에서 제한한 경우를 제외하고, 호스트 또는 구현체는 이 명세에 기술된 것 외의 추가 타입, 값, 객체, 프로퍼티, 함수
등을 제공할 수 있다. 이로 인해 (예: 전역 스코프에서 변수 조회 등) 일부 구성요소가 오류(예: ReferenceError )를 던지는 대신
호스트 정의 동작을 할 수
있다.
17.1 금지된 확장
구현체는 다음과 같이 이 명세를 확장해서는 안 된다:
엄격 모드
코드 에서 생성자 문법을 사용해 정의된 ECMAScript 함수 객체 에
"caller" 또는 "arguments" 라는 자체 프로퍼티를 생성해서는 안 된다. 이러한 자체
프로퍼티는 ArrowFunction , MethodDefinition , GeneratorDeclaration ,
GeneratorExpression ,
AsyncGeneratorDeclaration , AsyncGeneratorExpression , ClassDeclaration , ClassExpression , AsyncFunctionDeclaration , AsyncFunctionExpression , AsyncArrowFunction 으로 정의된
함수
객체 에도 생성되어서는 안 되며, 정의가 엄격 모드 코드 에 포함되어 있는지 여부와 관계없다.
내장 함수, Function 생성자 로 생성된 엄격 함수 , Generator 생성자 로 생성된 generator
함수, AsyncFunction 생성자 로 생성된 async 함수, bind 메서드로 생성된 함수 역시
이러한 자체 프로퍼티를 생성하면 안 된다.
어떤 구현체가 함수
객체 에 "caller" 라는 자체 프로퍼티를 확장한다면, [[Get]] 또는 [[GetOwnProperty]] 로 관찰되는 그 값은
엄격 함수
객체가 아니어야 한다. 만약 그 프로퍼티가 접근자 프로퍼티 라면, 그 [[Get]]
속성의 함수는 호출될 때 절대 엄격
함수 를 반환해서는 안 된다.
매핑된 또는 매핑되지 않은 arguments 객체 모두 "caller" 라는 자체 프로퍼티를 생성해서는 안 된다.
ECMA-402에 지정된 내장 메서드(예: toLocaleString)의 동작은 ECMA-402에 명시된 경우를 제외하고 확장해서는 안 된다.
22.2.1 및
B.1.2 의 RegExp 패턴 문법은
[UnicodeMode] 문법 파라미터가 있을 때 IdentityEscape [+UnicodeMode] 로
소스 문자 A-Z 또는 a-z를 인식하도록 확장되어서는 안 된다.
구문 문법(Syntactic Grammar)은 BindingIdentifier 비종단기호로 일치하는 소스 텍스트 바로 뒤에
: 토큰이 올 수 있도록 어떤 방식으로든 확장되어서는 안 된다.
엄격 모드
코드 처리 시 12.9.3.1 의
조기 오류 규칙을
완화해서는 안 된다.
TemplateEscapeSequence 를 12.9.4 에서 정의된 LegacyOctalEscapeSequence 또는 NonOctalDecimalEscapeSequence 를
포함하도록 확장해서는 안 된다.
엄격 모드
코드 처리 시 B.3.1 , B.3.2 ,
B.3.3 ,
B.3.5 에서 정의된 확장 기능을
지원해서는 안 된다.
Module 목표
기호(goal symbol) 파싱 시 B.1.1 에 정의된 렉시컬 문법 확장 기능을
지원해서는 안 된다.
ImportCall 을 확장해서는 안 된다.
18 ECMAScript 표준 내장 객체
특정 내장 객체들은 ECMAScript Script 또는 Module 이 실행을 시작할 때마다 사용할 수 있습니다. 그 중 글로벌 객체 는 실행 중인
프로그램의 글로벌 환경의 일부입니다. 다른 객체들은 글로벌 객체 의 초기 프로퍼티 또는 접근 가능한 내장 객체의 프로퍼티로 간접적으로 접근할 수
있습니다.
별도의 명시가 없는 한, 함수로 호출 가능한 내장 객체는 함수 객체 이며, 10.3 에서 설명된 특성을 가집니다. 별도의 명시가
없는 한, 내장 객체의 [[Extensible]] 내부 슬롯의 초기 값은 true 입니다. 모든 내장
함수 객체 는 [[Realm]] 내부 슬롯을 가지며, 그 값은 해당 객체가 처음 생성된 Realm Record 의 realm 입니다.
많은 내장 객체들은 함수입니다: 이들은 인자를 넘겨서 호출할 수 있습니다. 그 중 일부는 생성자 이기도 하며, new 연산자와 함께 사용하기 위한 함수입니다. 각 내장 함수에
대해 이 명세는 그 함수가 요구하는 인자와 해당 함수 객체 의 프로퍼티를 설명합니다. 각 내장 생성자 에 대해서도, 해당 생성자 의 프로토타입 객체의 프로퍼티와, 해당 생성자 를 호출하는 new
표현식이 반환하는 특정 객체 인스턴스의 프로퍼티를 설명합니다.
특정 함수의 설명에 별도의 명시가 없는 한, 내장 함수 또는 생성자 에 필요한 인자보다 적은 인자가 주어지면, 해당 함수 또는 생성자 는 부족한 인자 각각에 대해
undefined 값을 추가로 받은 것처럼 동작해야 합니다. 이러한 누락된 인자들은 “존재하지 않음”으로 간주되며, 명세 알고리즘에서 그렇게 식별될 수
있습니다. 특정 함수의 설명에서 “this 값”과 “NewTarget” 용어는 10.3 에서 정의된 의미를 가집니다.
특정 함수의 설명에 별도의 명시가 없는 한, 내장 함수 또는 생성자 에 정의된 허용 인자보다 더 많은 인자가 주어지면, 추가 인자들은 호출 시 평가되지만 함수에서는
무시됩니다. 하지만 구현체는 그러한 인자에 대해 구현체 고유의 동작을 정의할 수 있으며, 그 동작이 단순히 추가 인자가 존재한다는 이유로
TypeError 예외를 던지는 것이 아닌 한 허용됩니다.
참고 1
내장 함수 집합에 추가적인 기능을 더하는 구현체는 기존 함수에 새로운 파라미터를 추가하기보다는 새로운 함수를 추가하는 방식이 권장됩니다.
별도의 명시가 없는 한, 모든 내장 함수와 모든 내장 생성자 는 Function 프로토타입 객체 를 [[Prototype]] 내부 슬롯의 값으로 가지며, 이는 Function.prototype (20.2.3 )의 초기 값입니다.
별도의 명시가 없는 한, 모든 내장 프로토타입 객체는 Object 프로토타입
객체 를 [[Prototype]] 내부 슬롯의 값으로 가지며, 이는
Object.prototype (20.1.3 )의 초기
값입니다. 단, Object 프로토타입 객체 자체는 예외입니다.
이 명세가 내장 생성자 의 동작을 알고리즘
단계로 정의하는 경우, 이는 [[Call]] 및 [[Construct]] 양쪽 모두에 대한
동작입니다. 만약 그런 알고리즘이 두 경우를 구분할 필요가 있으면, NewTarget이 undefined 인지 검사하며, 이는 [[Call]] 호출임을 나타냅니다.
생성자로 식별되지 않은 내장 함수
객체 는 별도의 명시가 없는 한 [[Construct]] 내부 메서드를 구현하지 않습니다.
생성자가 아닌 내장 함수
객체 는 별도의 명시가 없는 한 "prototype" 프로퍼티를 가지지 않습니다.
이 명세에서 정의된 각 내장 함수는 CreateBuiltinFunction 추상 연산 (10.3.4 )을 호출하여 생성됩니다. length 와
name 파라미터의 값은 아래에서 논의된 대로 "length" 및 "name" 프로퍼티의 초기
값입니다. prefix 파라미터의 값도 아래에서 논의됩니다.
모든 내장 함수
객체 (생성자 포함)는 "length" 프로퍼티를 가지며, 그 값은 음수가 아닌 정수 Number 입니다. 별도의
명시가 없는 한, 이 값은 함수 설명의 하위 절 제목에 표시된 필수 파라미터의 수입니다. 선택적 파라미터와 rest 파라미터는 파라미터 수에 포함되지 않습니다.
참고 2
예를 들어, 함수
객체 로서 "map" 프로퍼티의 초기 값인 Array 프로토타입 객체 는
«Array.prototype.map (callback [ , thisArg])»라는 하위 절 제목 아래에 설명되어 있습니다. 여기서 두 인자 callback과
thisArg가 있는데, 후자는 선택적입니다. 따라서 해당 함수 객체 의 "length" 프로퍼티 값은
1 𝔽 입니다.
별도의 명시가 없는 한, 내장 함수
객체 의 "length" 프로퍼티는 { [[Writable]] :
false , [[Enumerable]] : false , [[Configurable]] : true } 속성을 가집니다.
모든 내장 함수
객체 (생성자 포함)는 "name" 프로퍼티를 가지며, 그 값은 문자열 입니다. 별도의 명시가 없는 한, 이 값은 이
명세에서 함수에 부여된 이름입니다. 익명 함수로 지정된 함수는 "name" 프로퍼티의 값으로 빈 문자열을 사용합니다. 객체의 프로퍼티로 지정된 함수의
경우, name 값은 해당 함수를 접근하는 프로퍼티
이름 문자열입니다. 내장 프로퍼티의 getter 또는 setter 함수로 지정된 함수는 prefix 파라미터에 각각
"get" 또는 "set" 을 전달합니다(CreateBuiltinFunction 호출 시).
프로퍼티 키 가 심볼(Symbol) 값일 때, 각 내장 함수의
"name" 프로퍼티의 값은 명시적으로 지정됩니다. 만약 명시적으로 지정된 값이 "get " 또는
"set " 로 시작하며, 해당 함수가 내장 프로퍼티의 getter 또는 setter 함수라면, prefix를 제외한 값이 name
파라미터로 전달되고, "get" 또는 "set" 이 prefix 파라미터로
전달됩니다(CreateBuiltinFunction 호출 시).
별도의 명시가 없는 한, 내장 함수
객체 의 "name" 프로퍼티는 { [[Writable]] :
false , [[Enumerable]] : false , [[Configurable]] : true } 속성을 가집니다.
19 에서
28 까지의 절 및 부록
B.2 에서 설명된 모든 기타 데이터 프로퍼티 는 별도의 명시가
없는 한 { [[Writable]] : true , [[Enumerable]] :
false , [[Configurable]] : true } 속성을 가집니다.
19 에서
28 까지의 절 및 부록
B.2 에서 설명된 모든 접근자 프로퍼티 는 별도의 명시가
없는 한 { [[Enumerable]] : false , [[Configurable]] : true } 속성을 가집니다. getter 함수만 설명된 경우 setter
함수는 기본값 undefined 입니다. setter만 설명된 경우 getter는 기본값 undefined 입니다.
19 글로벌 객체
글로벌 객체 :
어떤 실행
컨텍스트 에 진입하기 전에 생성됩니다.
[[Construct]] 내부 메서드를 가지고 있지 않으며, new 연산자와 함께 생성자 로 사용할 수 없습니다.
[[Call]] 내부 메서드를 가지고 있지 않으며, 함수로 호출될 수 없습니다.
[[Prototype]] 내부 슬롯의 값은 호스트 정의 입니다.
이 명세서에 정의된 속성 외에도 호스트
정의 속성을 추가로 가질 수 있습니다. 여기에는 값이 글로벌 객체 자체인 속성이 포함될 수 있습니다.
19.1 글로벌 객체의 값 속성
19.1.1 globalThis
글로벌
객체 의 "globalThis" 속성의 초기 값은 Realm Record
realm 에서 realm .[[GlobalEnv]] .[[GlobalThisValue]] 입니다.
이 속성의 특성은 { [[Writable]] :
true , [[Enumerable]] : false , [[Configurable]] : true }입니다.
19.1.2 Infinity
Infinity의 값은 +∞ 𝔽 입니다 (6.1.6.1 참조). 이 속성의 특성은
{ [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }입니다.
19.1.3 NaN
NaN의 값은 NaN 입니다 (6.1.6.1 참조). 이 속성의 특성은
{ [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }입니다.
19.1.4 undefined
undefined의 값은 undefined 입니다 (6.1.1 참조). 이 속성의 특성은
{ [[Writable]] : false ,
[[Enumerable]] : false , [[Configurable]] : false }입니다.
19.2 글로벌 객체의 함수 속성
19.2.1 eval ( x )
이 함수는 %eval% 내장 객체입니다.
호출될 때 다음 단계를 수행합니다:
? PerformEval (x ,
false , false )을 반환합니다.
19.2.1.1 PerformEval ( x , strictCaller ,
direct )
추상 연산 PerformEval은 x (ECMAScript 언어 값 ),
strictCaller (불리언), direct (불리언) 인자를 받고,
정상 완료 로
ECMAScript 언어 값
또는 throw 완료 를 반환합니다. 호출
시 다음 단계를 수행합니다:
Assert :
direct 가 false 이면 strictCaller 도
false 입니다.
x 가 문자열이
아니면 , x 를 반환합니다.
evalRealm 을 현재 Realm Record 로 둡니다.
참고: 직접
eval 의 경우, evalRealm 은 realm 이며, eval 호출자와
eval 함수 자체에 해당합니다.
? HostEnsureCanCompileStrings (evalRealm ,
« », x , direct )를 수행합니다.
inFunction 을 false 로 둡니다.
inMethod 을 false 로 둡니다.
inDerivedConstructor 을 false 로 둡니다.
inClassFieldInitializer 을 false 로 둡니다.
direct 가 true 이면
thisEnvRec 을 GetThisEnvironment ()로
둡니다.
thisEnvRec 이 함수 환경
레코드 라면
F 를 thisEnvRec .[[FunctionObject]] 로 둡니다.
inFunction 을 true 로 설정합니다.
inMethod 를 thisEnvRec .HasSuperBinding()으로
설정합니다.
F .[[ConstructorKind]] 가
derived 이면, inDerivedConstructor 를
true 로 설정합니다.
classFieldInitializerName 을 F .[[ClassFieldInitializerName]] 로 둡니다.
classFieldInitializerName 이 empty 가
아니면 inClassFieldInitializer 를 true 로
설정합니다.
다음 하위 단계를 구현 정의 순서로, 파싱과 오류 감지를 교차하면서
수행합니다:
script 를 ParseText (x , Script )로 둡니다.
script 가 오류
리스트 이면, SyntaxError 예외를 throw합니다.
script Contains
ScriptBody 가
false 이면, undefined 를 반환합니다.
body 를 script 의 ScriptBody 로 둡니다.
inFunction 이 false 이고 body
Contains
NewTarget 가
있으면, SyntaxError 예외를 throw합니다.
inMethod 이 false 이고 body
Contains
SuperProperty 가 있으면,
SyntaxError 예외를 throw합니다.
inDerivedConstructor 가 false 이고
body Contains
SuperCall 가
있으면, SyntaxError 예외를 throw합니다.
inClassFieldInitializer 이 true 이고
ContainsArguments 의
body 가 true 이면, SyntaxError
예외를 throw합니다.
strictCaller 가 true 이면, strictEval 을
true 로 둡니다.
그렇지 않으면, strictEval 을 ScriptIsStrict 의
script 값으로 둡니다.
runningContext 를 실행 중인 실행
컨텍스트 로 둡니다.
참고: direct 가 true 이면, runningContext 는
실행 컨텍스트 이며,
직접
eval 을 수행한 컨텍스트입니다. direct 가
false 이면, runningContext 는 eval 함수 호출을 위한
실행 컨텍스트 입니다.
direct 가 true 이면
lexEnv 를 NewDeclarativeEnvironment (runningContext 의
LexicalEnvironment)로 둡니다.
varEnv 를 runningContext 의 VariableEnvironment로 둡니다.
privateEnv 를 runningContext 의 PrivateEnvironment로 둡니다.
그렇지 않으면,
lexEnv 를 NewDeclarativeEnvironment (evalRealm .[[GlobalEnv]] )로 둡니다.
varEnv 를 evalRealm .[[GlobalEnv]] 로 둡니다.
privateEnv 를 null 로 둡니다.
strictEval 이 true 이면, varEnv 를
lexEnv 로 설정합니다.
runningContext 가 이미 suspend되지 않았다면, runningContext 를 suspend합니다.
evalContext 를 새로운 ECMAScript 코드 실행
컨텍스트 로 둡니다.
evalContext 의 Function을 null 로 설정합니다.
evalContext 의 Realm 을 evalRealm 으로 설정합니다.
evalContext 의 ScriptOrModule을 runningContext 의 ScriptOrModule로
설정합니다.
evalContext 의 VariableEnvironment를 varEnv 로 설정합니다.
evalContext 의 LexicalEnvironment를 lexEnv 로 설정합니다.
evalContext 의 PrivateEnvironment를 privateEnv 로 설정합니다.
evalContext 를 실행 컨텍스트 스택 에 push합니다;
evalContext 는 이제 실행 중인 실행
컨텍스트 입니다.
result 를 Completion (EvalDeclarationInstantiation (body ,
varEnv , lexEnv , privateEnv ,
strictEval ))로 둡니다.
result 가 정상
완료 이면,
result 를 Completion (Evaluation 의 body )로
설정합니다.
result 가 정상
완료 이고 result .[[Value]] 가
empty 이면,
result 를 NormalCompletion (undefined )로
설정합니다.
evalContext 를 suspend 시키고 실행 컨텍스트 스택 에서
제거합니다.
이제 실행 컨텍스트 스택 맨 위에 있는 컨텍스트를
실행 중인 실행 컨텍스트 로 복구합니다.
? result 를 반환합니다.
참고
eval 코드가 호출 컨텍스트의 변수 환경에 변수나 함수 바인딩을 생성할 수 없는 경우는, 호출 컨텍스트의 코드나 eval 코드가 엄격
모드 코드 인 경우입니다.
대신 이러한 바인딩은 eval 코드에서만 접근 가능한 새로운 VariableEnvironment에서 생성됩니다. let,
const, class 선언을 통해 도입된 바인딩은 항상 새로운 LexicalEnvironment에서
생성됩니다.
19.2.1.2 HostEnsureCanCompileStrings ( calleeRealm ,
parameterStrings , bodyString , direct )
호스트 정의
추상 연산 HostEnsureCanCompileStrings는 calleeRealm (Realm Record ),
parameterStrings (문자열
리스트 ), bodyString (문자열), direct (불리언)을 인자로 받고,
정상 완료 로
unused 또는 throw
완료 를 반환합니다. 이 연산은 호스트 환경 이 개발자가 문자열을 ECMAScript 코드로 해석·평가할 수 있게
하는 특정 ECMAScript 함수를 차단할 수 있도록 합니다.
parameterStrings 는 생성자 중 하나를 사용할 때 매개변수 리스트를 구성하기 위해 연결되는 문자열들을
나타냅니다. bodyString 은 함수 본문이나 eval 호출에 전달되는 문자열을 나타냅니다.
direct 는 평가가 직접
eval 인지 여부를 나타냅니다.
HostEnsureCanCompileStrings의 기본 구현은 NormalCompletion (unused )을
반환하는 것입니다.
19.2.1.3 EvalDeclarationInstantiation ( body ,
varEnv , lexEnv , privateEnv , strict )
추상 연산 EvalDeclarationInstantiation은 body (ScriptBody 구문
노드 ), varEnv (Environment Record ),
lexEnv (Declarative Environment
Record ), privateEnv (PrivateEnvironment Record 또는
null ), strict (불리언) 인자를 받고, 정상 완료 로
unused 또는 throw
완료 를 반환합니다. 호출 시 다음 단계를 수행합니다:
varNames 를 body 의 VarDeclaredNames 로
둡니다.
varDeclarations 를 body 의 VarScopedDeclarations 로
둡니다.
strict 가 false 이면
varEnv 가 Global
Environment Record 라면
varNames 의 각 name 에 대해
HasLexicalDeclaration (varEnv ,
name )가 true 이면,
SyntaxError 예외를 throw합니다.
참고: eval은 전역 렉시컬 선언에 의해 가려지는 전역 var 선언을 생성하지
않습니다.
thisEnv 를 lexEnv 로 둡니다.
Assert : 다음 루프는 종료됩니다.
다음이 참인 동안 반복합니다: thisEnv 와 varEnv 가 같은 Environment Record 가
아님
thisEnv 가 객체가 아니고
Environment
Record 라면
참고: with 문의 환경은 어떠한 렉시컬 선언도 포함할 수 없으므로 var/let 호이스팅 충돌을 검사할
필요가 없습니다.
varNames 의 각 name 에 대해
! thisEnv .HasBinding(name )이
true 라면
SyntaxError 예외를 throw합니다.
참고: 부록 B.3.4 는
위 단계에 대해 대체 의미론을 정의합니다.
참고: 직접
eval 은 이름이 같은 렉시컬 선언 위로 var
선언을 호이스팅하지 않습니다.
thisEnv 를 thisEnv .[[OuterEnv]] 로 설정합니다.
privateIdentifiers 를 새로운 빈 리스트 로 둡니다.
pointer 를 privateEnv 로 둡니다.
pointer 가 null 이 아닐 동안 반복합니다,
pointer .[[Names]] 의 각 Private Name
binding 에 대해
privateIdentifiers 에 binding .[[Description]] 이 없다면,
binding .[[Description]] 을
privateIdentifiers 에 추가합니다.
pointer 를 pointer .[[OuterPrivateEnvironment]] 로 설정합니다.
AllPrivateIdentifiersValid 의
body 와 인자 privateIdentifiers 가 false 라면,
SyntaxError 예외를 throw합니다.
functionsToInitialize 를 새로운 빈 리스트 로 둡니다.
declaredFunctionNames 를 새로운 빈 리스트 로 둡니다.
varDeclarations 의 각 d 에 대해, 리스트를 역순으로 처리합니다
d 가 VariableDeclaration ,
ForBinding ,
BindingIdentifier 중 어느
것도 아니면
Assert : d 는 FunctionDeclaration ,
GeneratorDeclaration ,
AsyncFunctionDeclaration ,
AsyncGeneratorDeclaration
중 하나입니다.
참고: 동일한 이름의 함수 선언이 여러 개 있으면, 마지막 선언이 사용됩니다.
fn 을 d 의 BoundNames 의
유일한 요소로 둡니다.
declaredFunctionNames 에 fn 이 없다면,
varEnv 가 Global
Environment Record 라면
fnDefinable 을 ? CanDeclareGlobalFunction (varEnv ,
fn )로 둡니다.
fnDefinable 이 false 이면,
TypeError 예외를 throw합니다.
fn 을 declaredFunctionNames 에 추가합니다.
d 를 functionsToInitialize 의 첫 번째 요소로
삽입합니다.
declaredVarNames 를 새로운 빈 리스트 로 둡니다.
varDeclarations 의 각 d 에 대해
d 가 VariableDeclaration ,
ForBinding ,
BindingIdentifier 중 하나라면
d 의 BoundNames 의
각 문자열 vn 에 대해
declaredFunctionNames 에 vn 이 없다면,
varEnv 가 Global
Environment Record 라면
vnDefinable 을 ? CanDeclareGlobalVar (varEnv ,
vn )로 둡니다.
vnDefinable 이
false 이면,
TypeError 예외를 throw합니다.
declaredVarNames 에 vn 이 없다면,
vn 을 declaredVarNames 에
추가합니다.
참고: 부록 B.3.2.3 가
이 지점에 추가 단계를 포함합니다.
참고: 이 알고리즘 단계 이후에는
varEnv 가 Global Environment
Record 이고 글로벌 객체 가 프록시 이국
객체 인 경우가 아니면 비정상 종료가 발생하지 않습니다.
lexDeclarations 를 body 의 LexicallyScopedDeclarations 로
둡니다.
lexDeclarations 의 각 d 에 대해
참고: 렉시컬로 선언된 이름은 여기서 인스턴스화만 되고 초기화되지는 않습니다.
d 의 BoundNames 의 각
dn 에 대해
IsConstantDeclaration 의
d 가 true 이면,
? lexEnv .CreateImmutableBinding(dn ,
true )를 수행합니다.
그렇지 않으면,
? lexEnv .CreateMutableBinding(dn ,
false )를 수행합니다.
functionsToInitialize 의 각 구문 노드
f 에 대해
fn 을 f 의 BoundNames 의
유일한 요소로 둡니다.
fo 를 f 의 InstantiateFunctionObject 와
인자 lexEnv , privateEnv 로 둡니다.
varEnv 가 Global
Environment Record 라면
? CreateGlobalFunctionBinding (varEnv ,
fn , fo , true )를 수행합니다.
그렇지 않으면,
bindingExists 를
! varEnv .HasBinding(fn )로 둡니다.
bindingExists 가 false 이면,
참고: 아래 호출은 비정상
완료 를 반환할 수 없습니다. 이는 14
이전의 검증 때문입니다.
! varEnv .CreateMutableBinding(fn ,
true )를 수행합니다.
! varEnv .InitializeBinding(fn ,
fo )를 수행합니다.
그렇지 않으면,
! varEnv .SetMutableBinding(fn ,
fo , false )를 수행합니다.
declaredVarNames 의 각 문자열 vn 에 대해
varEnv 가 Global
Environment Record 라면
? CreateGlobalVarBinding (varEnv ,
vn , true )를 수행합니다.
그렇지 않으면,
bindingExists 를
! varEnv .HasBinding(vn )로 둡니다.
bindingExists 가 false 이면,
참고: 아래 호출은 비정상
완료 를 반환할 수 없습니다. 이는 14
이전의 검증 때문입니다.
! varEnv .CreateMutableBinding(vn ,
true )를 수행합니다.
! varEnv .InitializeBinding(vn ,
undefined )를 수행합니다.
unused 를 반환합니다.
참고
이 알고리즘의 대체 버전은 B.3.4 에 설명되어
있습니다.
19.2.2 isFinite ( number )
이 함수는 %isFinite% 내장 객체입니다.
호출될 때 다음 단계들을 수행합니다:
num 을 ? ToNumber (number )로 둡니다.
num 이 finite 가 아니면, false 를 반환합니다.
그렇지 않으면, true 를 반환합니다.
19.2.3 isNaN ( number )
이 함수는 %isNaN% 내장 객체입니다.
호출될 때 다음 단계들을 수행합니다:
num 을 ? ToNumber (number )로 둡니다.
num 이 NaN 이면, true 를 반환합니다.
그렇지 않으면, false 를 반환합니다.
참고
ECMAScript 코드에서 값 X가 NaN 인지 신뢰성 있게 검사하는 방법은
X !== X 형태의 표현식을 사용하는 것입니다. X가 NaN 일 때만 결과가
true 가 됩니다.
19.2.4 parseFloat ( string )
이 함수는 string 인자의 내용을 10진수 리터럴로 해석하여 Number 값을 생성합니다.
이 함수는 %parseFloat% 내장 객체입니다.
호출될 때 다음 단계들을 수행합니다:
inputString 을 ? ToString (string )로 둡니다.
trimmedString 을 ! TrimString (inputString ,
start )로 둡니다.
trimmed 을 StringToCodePoints (trimmedString )로
둡니다.
trimmedPrefix 를 trimmed 의 접두사 중 StrDecimalLiteral 의 문법을 만족하는 가장 긴
접두사로 둡니다. 이 값은 trimmed 자체일 수도 있습니다. 만약 그런 접두사가 없다면 NaN 를
반환합니다.
parsedNumber 를 ParseText (trimmedPrefix , StrDecimalLiteral )로
둡니다.
Assert :
parsedNumber 는 구문 노드 입니다.
parsedNumber 의 StringNumericValue 를
반환합니다.
참고
이 함수는 string 의 앞부분만 Number 값으로 해석할 수 있으며, 10진수 리터럴 표기법의 일부로 해석할 수 없는 코드 유닛들은
무시되고, 이러한 코드 유닛이 무시되었다는 표시가 제공되지 않습니다.
19.2.5 parseInt ( string , radix )
이 함수는 지정된 radix 에 따라 string 의 내용을 해석하여 정수 Number 값을 생성합니다.
string 의 선행 공백은 무시됩니다. radix 가 0으로 변환될 경우(undefined 일 때
등), 숫자 표기가 "0x" 또는 "0X" 로 시작하지 않는 한 10으로 간주합니다.
radix 가 16이면 숫자 표기는 "0x" 또는 "0X" 로 시작할 수 있습니다.
이 함수는 %parseInt% 내장 객체입니다.
호출될 때 다음 단계들을 수행합니다:
inputString 을 ? ToString (string )로 둡니다.
S 를 ! TrimString (inputString ,
start )로 둡니다.
sign 을 1로 둡니다.
S 가 비어 있지 않고 첫 코드 유닛이 0x002D(HYPHEN-MINUS)라면 sign 을 -1로 설정합니다.
S 가 비어 있지 않고 첫 코드 유닛이 0x002B(PLUS SIGN) 또는 0x002D(HYPHEN-MINUS)라면,
S 를 인덱스 1부터의 substring 로 둡니다.
R 을 ℝ (?
ToInt32 (radix ))로 둡니다.
stripPrefix 를 true 로 둡니다.
R ≠ 0이면,
R < 2 또는 R > 36이면 NaN 를 반환합니다.
R ≠ 16이면 stripPrefix 를 false 로 설정합니다.
그렇지 않으면,
R 을 10으로 설정합니다.
stripPrefix 가 true 면,
S 의 길이가 2 이상이고 처음 두 코드 유닛이 "0x" 또는
"0X" 라면,
S 를 인덱스 2부터의 substring 로 둡니다.
R 을 16으로 설정합니다.
S 가 radix-R 숫자가 아닌 코드 유닛을 포함하면, end 를 해당 코드 유닛의 인덱스로 둡니다.
그렇지 않으면 end 를 S 의 길이로 둡니다.
Z 를 S 의 0부터 end 까지의 substring 로 둡니다.
Z 가 비어 있으면 NaN 를 반환합니다.
mathInt 를 Z 가 radix-R 표기법으로 나타내는 정수 값으로 둡니다. 이때 값
10~35에 해당하는 숫자는 A ~Z 와 a ~z 로 표시됩니다. (R = 10이고
Z 에 20개를 초과하는 유효 숫자가 있으면, 20번째 이후의 모든 유효 숫자는 구현에 따라 0으로 대체할 수 있습니다.
R 이 2,4,8,10,16,32 중 하나가 아니면 mathInt 는 구현 근사 정수 일 수 있습니다.)
mathInt = 0이면,
sign = -1이면 -0 𝔽 를 반환합니다.
+0 𝔽 를 반환합니다.
𝔽 (sign ×
mathInt )를 반환합니다.
참고
이 함수는 string 의 앞부분만 정수 값으로 해석할 수 있으며, 정수 표기법 일부로 해석할 수 없는 코드 유닛은
무시되고, 무시되었다는 표시가 제공되지 않습니다.
19.2.6 URI 처리 함수
Uniform Resource Identifiers, 즉 URI는 인터넷에서 자원(예: 웹 페이지 또는 파일)과 이를 접근하는 전송 프로토콜(예: HTTP 또는 FTP)을
식별하는 문자열입니다. ECMAScript 언어 자체는 이 절에서 설명된 URI를 인코드 및 디코드하는 함수 외에는 URI를 사용하는 지원을 제공하지 않습니다.
encodeURI와 decodeURI는 전체 URI에 사용하도록 설계되어 있으며, 예약 문자가 특별한 의미(예: 구분자)를
가진 것으로 간주하므로 인코드하지 않습니다. encodeURIComponent와 decodeURIComponent는 URI의
개별 구성요소에 사용하도록 설계되어 있으며, 예약 문자가 텍스트로 간주되어 전체 URI의 일부가 될 때 특별한 의미를 방지하기 위해 인코딩되어야 합니다.
참고 1
예약 문자 집합은 RFC 2396을 기반으로 하며, 이후의 RFC 3986에서 도입된 변경 사항을 반영하지 않습니다.
참고 2
많은 ECMAScript 구현체는 웹 페이지를 조작하는 추가 함수 및 메서드를 제공합니다. 이러한 함수들은 이 표준의 범위를 벗어납니다.
19.2.6.1 decodeURI ( encodedURI )
이 함수는 encodeURI 함수에 의해 도입될 수 있는 이스케이프 시퀀스와 UTF-8 인코딩을 각각 그에 해당하는 코드 포인트의 UTF-16
인코딩으로 대체한 새로운 URI 버전을 계산합니다. encodeURI에 의해 도입될 수 없는 이스케이프 시퀀스는 대체되지 않습니다.
이 함수는 %decodeURI% 내장 객체입니다.
호출 시 다음 단계를 수행합니다:
uriString 을 ? ToString (encodedURI )로 둡니다.
preserveEscapeSet 을 ";/?:@&=+$,#" 로 둡니다.
? Decode (uriString ,
preserveEscapeSet )를 반환합니다.
19.2.6.2 decodeURIComponent ( encodedURIComponent )
이 함수는 encodeURIComponent 함수에 의해 도입될 수 있는 이스케이프 시퀀스와 UTF-8 인코딩을 각각 그에 해당하는 코드
포인트의 UTF-16 인코딩으로 대체한 새로운 URI 버전을 계산합니다.
이 함수는 %decodeURIComponent% 내장 객체입니다.
호출 시 다음 단계를 수행합니다:
componentString 을 ? ToString (encodedURIComponent )로
둡니다.
preserveEscapeSet 을 빈 문자열로 둡니다.
? Decode (componentString ,
preserveEscapeSet )를 반환합니다.
19.2.6.3 encodeURI ( uri )
이 함수는 UTF-16으로 인코딩된 (6.1.4 )
URI의 각 특정 코드 포인트 인스턴스를 해당 코드 포인트의 UTF-8 인코딩을 나타내는 하나, 둘, 셋 또는 넷의 이스케이프 시퀀스로 대체한 새로운 버전을
계산합니다.
이 함수는 %encodeURI% 내장 객체입니다.
호출 시 다음 단계를 수행합니다:
uriString 을 ? ToString (uri )로 둡니다.
extraUnescaped 를 ";/?:@&=+$,#" 로 둡니다.
? Encode (uriString ,
extraUnescaped )를 반환합니다.
19.2.6.4 encodeURIComponent ( uriComponent )
이 함수는 UTF-16으로 인코딩된 (6.1.4 )
URI의 각 특정 코드 포인트 인스턴스를 해당 코드 포인트의 UTF-8 인코딩을 나타내는 하나, 둘, 셋 또는 넷의 이스케이프 시퀀스로 대체한 새로운 버전을
계산합니다.
이 함수는 %encodeURIComponent% 내장 객체입니다.
호출 시 다음 단계를 수행합니다:
componentString 을 ? ToString (uriComponent )로 둡니다.
extraUnescaped 를 빈 문자열로 둡니다.
? Encode (componentString ,
extraUnescaped )를 반환합니다.
19.2.6.5 Encode ( string , extraUnescaped )
추상 연산 Encode는 string (문자열)과 extraUnescaped (문자열) 인자를 받고, 정상 완료 로 문자열 또는
throw 완료 를 반환합니다. URI
인코딩 및 이스케이프를 수행하며, string 을 6.1.4 에서 설명된 UTF-16
인코딩 코드 포인트 시퀀스로 해석합니다. 문자가 RFC 2396에서 예약되지 않은 것으로 판별되거나 extraUnescaped 에 나타나면
이스케이프되지 않습니다. 호출 시 다음 단계를 수행합니다:
len 을 string 의 길이로 둡니다.
R 을 빈 문자열로 둡니다.
alwaysUnescaped 를 문자열 연결 로 ASCII 단어 문자 와
"-.!~*'()" 의 연결로 둡니다.
unescapedSet 을 문자열 연결 로
alwaysUnescaped 와 extraUnescaped 의 연결로 둡니다.
k 를 0으로 둡니다.
k < len 인 동안 반복합니다,
C 를 string 의 인덱스 k 에 있는 코드 유닛으로 둡니다.
unescapedSet 에 C 가 포함되어 있으면,
k 를 k + 1로 설정합니다.
R 을 문자열
연결 로 R 과 C 의 연결로 설정합니다.
그렇지 않으면,
cp 를 CodePointAt (string ,
k )로 둡니다.
cp .[[IsUnpairedSurrogate]] 가
true 이면 URIError 예외를 throw합니다.
k 를 k + cp .[[CodeUnitCount]] 로 설정합니다.
Octets 를 리스트 로
cp .[[CodePoint]] 에 UTF-8 변환을 적용하여
얻은 옥텟들로 둡니다.
Octets 의 각 octet 에 대해,
hex 를 octet 의 문자열 표현으로, 대문자 16진수로 포맷합니다.
R 을 문자열
연결 로 R ,
"%" , StringPad (hex ,
2, "0" , start )의
연결로 설정합니다.
R 를 반환합니다.
참고
퍼센트 인코딩은 개별 옥텟을 나타내는 데 사용되므로, 하나의 코드 포인트가 여러 연속 이스케이프 시퀀스(각각 8비트 UTF-8 코드 유닛 하나씩)로
표현될 수 있습니다.
19.2.6.6 Decode ( string ,
preserveEscapeSet )
추상 연산 Decode는 string (문자열)과 preserveEscapeSet (문자열) 인자를 받고, 정상 완료 로 문자열 또는
throw 완료 를 반환합니다. 이는
URI 이스케이프 해제 및 디코딩을 수행하며, preserveEscapeSet 에 해당하는 Basic Latin 문자의 이스케이프 시퀀스는
보존합니다. 호출 시 다음 단계를 수행합니다:
len 을 string 의 길이로 둡니다.
R 을 빈 문자열로 둡니다.
k 를 0으로 둡니다.
k < len 인 동안 반복합니다,
C 를 string 의 인덱스 k 에 있는 코드 유닛으로 둡니다.
S 를 C 로 둡니다.
C 가 코드 유닛 0x0025(PERCENT SIGN)이면,
k + 3 > len 이면 URIError
예외를 throw합니다.
escape 를 substring 로
string 의 k 부터 k + 3까지로 둡니다.
B 를 ParseHexOctet (string ,
k + 1)로 둡니다.
B 가 정수 가 아니면
URIError 예외를 throw합니다.
k 를 k + 2로 설정합니다.
n 을 B 의 선행 1 비트 개수로 둡니다.
n = 0이면,
asciiChar 를 값이 B 인 코드 유닛으로 둡니다.
preserveEscapeSet 에 asciiChar 가 포함되어 있으면
S 를 escape 로, 아니면 S 를
asciiChar 로 설정합니다.
그렇지 않으면,
n = 1 또는 n > 4이면
URIError 예외를 throw합니다.
Octets 를 « B »로 둡니다.
j 를 1로 둡니다.
j < n 인 동안 반복합니다,
k 를 k + 1로 설정합니다.
k + 3 > len 이면
URIError 예외를 throw합니다.
string 의 인덱스 k 에 있는 코드 유닛이
0x0025(PERCENT SIGN)가 아니면
URIError 예외를 throw합니다.
continuationByte 를 ParseHexOctet (string ,
k + 1)로 둡니다.
continuationByte 가 정수 가 아니면
URIError 예외를 throw합니다.
Octets 에 continuationByte 를
추가합니다.
k 를 k + 2로 설정합니다.
j 를 j + 1로 설정합니다.
Assert :
Octets 의 길이는 n 입니다.
Octets 가 유효한 UTF-8 인코딩의 유니코드 코드 포인트를 포함하지 않으면
URIError 예외를 throw합니다.
V 를 Octets 에 UTF-8 변환을 적용하여 얻은 코드 포인트로
둡니다. 즉, 옥텟 리스트를 21비트 값으로 변환합니다.
S 를 UTF16EncodeCodePoint (V )로
설정합니다.
R 을 문자열 연결 로 R 과
S 의 연결로 설정합니다.
k 를 k + 1로 설정합니다.
R 를 반환합니다.
참고
RFC 3629는 잘못된 UTF-8 옥텟 시퀀스의 디코딩을 금지합니다. 예를 들어, 잘못된 시퀀스 0xC0 0x80은 코드 유닛 0x0000으로
디코딩되어서는 안 됩니다. Decode 알고리즘의 구현체는 이러한 잘못된 시퀀스를 만날 때 반드시 URIError 를
throw해야 합니다.
19.2.6.7 ParseHexOctet ( string , position
)
추상 연산 ParseHexOctet은 string (문자열)과 position (0 이상의 정수 ) 인자를 받고, 0 이상의
정수 또는 비어 있지 않은
리스트 의
SyntaxError 객체들을 반환합니다. string 의 지정된 position 에서 두 개의
16진수 문자를 부호 없는 8비트 정수 로 파싱합니다. 호출 시 다음 단계를 수행합니다:
len 을 string 의 길이로 둡니다.
Assert :
position + 2 ≤ len .
hexDigits 를 substring 로 string 의
position 부터 position + 2까지로 둡니다.
parseResult 를 ParseText (hexDigits , HexDigits [~Sep] )로
둡니다.
parseResult 가 구문 노드 가 아니면
parseResult 를 반환합니다.
n 을 parseResult 의 MV로 둡니다.
Assert :
n 은 0에서 255까지의 포함 구간 내에 있습니다.
n 을 반환합니다.
19.3 글로벌 객체의 생성자 속성
19.3.1 AggregateError ( . . . )
20.5.7.1 를 참조하세요.
19.3.2 Array ( . . . )
23.1.1 를 참조하세요.
19.3.3 ArrayBuffer ( . . . )
25.1.4 를 참조하세요.
19.3.4 BigInt ( . . . )
21.2.1 를 참조하세요.
19.3.5 BigInt64Array ( . . . )
23.2.5 를 참조하세요.
19.3.6 BigUint64Array ( . . . )
23.2.5 를 참조하세요.
19.3.7 Boolean ( . . . )
20.3.1 를 참조하세요.
19.3.8 DataView ( . . . )
25.3.2 를 참조하세요.
19.3.9 Date ( . . . )
21.4.2 를 참조하세요.
19.3.10 Error ( . . . )
20.5.1 를 참조하세요.
19.3.11 EvalError ( . . . )
20.5.5.1 를
참조하세요.
19.3.12 FinalizationRegistry ( . . . )
26.2.1 를 참조하세요.
19.3.13 Float16Array ( . . . )
23.2.5 를 참조하세요.
19.3.14 Float32Array ( . . . )
23.2.5 를 참조하세요.
19.3.15 Float64Array ( . . . )
23.2.5 를 참조하세요.
19.3.16 Function ( . . . )
20.2.1 를 참조하세요.
19.3.17 Int8Array ( . . . )
23.2.5 를 참조하세요.
19.3.18 Int16Array ( . . . )
23.2.5 를 참조하세요.
19.3.19 Int32Array ( . . . )
23.2.5 를 참조하세요.
19.3.20 Iterator ( . . . )
27.1.3.1 를 참조하세요.
19.3.21 Map ( . . . )
24.1.1 를 참조하세요.
19.3.22 Number ( . . . )
21.1.1 를 참조하세요.
19.3.23 Object ( . . . )
20.1.1 를 참조하세요.
19.3.24 Promise ( . . . )
27.2.3 를 참조하세요.
19.3.25 Proxy ( . . . )
28.2.1 를 참조하세요.
19.3.26 RangeError ( . . . )
20.5.5.2 를
참조하세요.
19.3.27 ReferenceError ( . . . )
20.5.5.3 를
참조하세요.
19.3.28 RegExp ( . . . )
22.2.4 를 참조하세요.
19.3.29 Set ( . . . )
24.2.2 를 참조하세요.
19.3.30 SharedArrayBuffer ( . . . )
25.2.3 를 참조하세요.
19.3.31 String ( . . . )
22.1.1 를 참조하세요.
19.3.32 Symbol ( . . . )
20.4.1 를 참조하세요.
19.3.33 SyntaxError ( . . . )
20.5.5.4 를
참조하세요.
19.3.34 TypeError ( . . . )
20.5.5.5 를
참조하세요.
19.3.35 Uint8Array ( . . . )
23.2.5 를 참조하세요.
19.3.36 Uint8ClampedArray ( . . . )
23.2.5 를 참조하세요.
19.3.37 Uint16Array ( . . . )
23.2.5 를 참조하세요.
19.3.38 Uint32Array ( . . . )
23.2.5 를 참조하세요.
19.3.39 URIError ( . . . )
20.5.5.6 를
참조하세요.
19.3.40 WeakMap ( . . . )
24.3.1 를 참조하세요.
19.3.41 WeakRef ( . . . )
26.1.1 를 참조하세요.
19.3.42 WeakSet ( . . . )
24.4 를 참조하세요.
19.4 글로벌 객체의 기타 속성
19.4.1 Atomics
25.4 를 참조하세요.
19.4.2 JSON
25.5 를
참조하세요.
19.4.3 Math
21.3 를
참조하세요.
19.4.4 Reflect
28.1 를 참조하세요.
20 기본 객체
20.1 Object 객체
20.1.1 Object 생성자
Object 생성자 :
%Object% 입니다.
"Object" 속성의 초기값이며, 글로벌 객체 의 값입니다.
생성자 로 호출될
때 새로운 일반
객체 를 생성합니다.
생성자 대신
함수로 호출될 때 타입 변환을 수행합니다.
클래스 정의의 extends 절의 값으로 사용할 수 있습니다.
20.1.1.1 Object ( [ value ] )
이 함수는 호출될 때 다음 단계를 수행합니다:
NewTarget이 undefined 도 활성 함수 객체 도 아니면,
? OrdinaryCreateFromConstructor (NewTarget,
"%Object.prototype%" )를 반환합니다.
value 가 undefined 또는 null 이면,
OrdinaryObjectCreate (%Object.prototype% )를
반환합니다.
! ToObject (value )를 반환합니다.
20.1.2 Object 생성자의 속성
Object 생성자 :
20.1.2.1 Object.assign ( target ,
...sources )
이 함수는 하나 이상의 소스 객체에서 모든 열거 가능한 자체 속성의 값을 target 객체로 복사합니다.
호출될 때 다음 단계를 수행합니다:
to 를 ? ToObject (target )로 둡니다.
인자가 하나만 전달되면 to 를 반환합니다.
sources 의 각 요소 nextSource 에 대해,
nextSource 가 undefined 도
null 도 아니면,
from 을 ! ToObject (nextSource )로
둡니다.
keys 를 ? from .[[OwnPropertyKeys]] () 로 둡니다.
keys 의 각 요소 nextKey 에 대해,
desc 를 ? from .[[GetOwnProperty]] (nextKey )로
둡니다.
desc 가 undefined 가 아니고
desc .[[Enumerable]] 가
true 이면,
propValue 를 ? Get (from ,
nextKey )로 둡니다.
? Set (to ,
nextKey , propValue ,
true )를 수행합니다.
to 를 반환합니다.
이 함수의 "length" 속성 값은 2 𝔽 입니다.
20.1.2.2 Object.create ( O , Properties )
이 함수는 지정된 프로토타입을 가진 새 객체를 생성합니다.
호출될 때 다음 단계를 수행합니다:
O 가 객체가 아니고 O 가
null 이 아니면, TypeError 예외를 throw합니다.
obj 를 OrdinaryObjectCreate (O )로
둡니다.
Properties 가 undefined 가 아니면,
? ObjectDefineProperties (obj ,
Properties )를 반환합니다.
obj 를 반환합니다.
20.1.2.3 Object.defineProperties ( O ,
Properties )
이 함수는 객체의 자체 속성을 추가하고/또는 기존 자체 속성의 특성을 갱신합니다.
호출될 때 다음 단계를 수행합니다:
O 가 객체가 아니면 , TypeError
예외를 throw합니다.
? ObjectDefineProperties (O ,
Properties )를 반환합니다.
20.1.2.3.1 ObjectDefineProperties ( O ,
Properties )
추상 연산 ObjectDefineProperties는 O (객체)와 Properties (ECMAScript 언어 값 ) 인자를 받고,
정상 완료 로 객체 또는
throw 완료 를 반환합니다.
호출 시 다음 단계를 수행합니다:
props 를 ? ToObject (Properties )로
둡니다.
keys 를 ? props .[[OwnPropertyKeys]] () 로 둡니다.
descriptors 를 새로운 빈 리스트 로 둡니다.
keys 의 각 요소 nextKey 에 대해,
propDesc 를 ? props .[[GetOwnProperty]] (nextKey )로
둡니다.
propDesc 가 undefined 가 아니고
propDesc .[[Enumerable]] 가
true 이면,
descObj 를 ? Get (props ,
nextKey )로 둡니다.
desc 를 ? ToPropertyDescriptor (descObj )로
둡니다.
Record
{ [[Key]] : nextKey , [[Descriptor]] : desc }
를 descriptors 에 추가합니다.
descriptors 의 각 요소 property 에 대해,
? DefinePropertyOrThrow (O ,
property .[[Key]] ,
property .[[Descriptor]] )를 수행합니다.
O 를 반환합니다.
20.1.2.4 Object.defineProperty ( O , P ,
Attributes )
이 함수는 객체의 자체 속성을 추가하고/또는 기존 자체 속성의 특성을 갱신합니다.
호출될 때 다음 단계를 수행합니다:
O 가 객체가 아니면 , TypeError
예외를 throw합니다.
key 를 ? ToPropertyKey (P )로 둡니다.
desc 를 ? ToPropertyDescriptor (Attributes )로
둡니다.
? DefinePropertyOrThrow (O ,
key , desc )를 수행합니다.
O 를 반환합니다.
20.1.2.5 Object.entries ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
obj 를 ? ToObject (O )로 둡니다.
entryList 를 ? EnumerableOwnProperties (obj ,
key+value )로 둡니다.
CreateArrayFromList (entryList )를
반환합니다.
20.1.2.6 Object.freeze ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
O 가 객체가 아니면 , O 를 반환합니다.
status 를 ? SetIntegrityLevel (O ,
frozen )로 둡니다.
status 가 false 이면, TypeError 예외를
throw합니다.
O 를 반환합니다.
20.1.2.7 Object.fromEntries ( iterable )
이 함수는 호출될 때 다음 단계를 수행합니다:
? RequireObjectCoercible (iterable )를
수행합니다.
obj 를 OrdinaryObjectCreate (%Object.prototype% )로
둡니다.
Assert :
obj 는 자신의 속성이 없는 확장 가능한 일반 객체 입니다.
closure 를 Abstract Closure
(매개변수 (key , value ), obj 캡처)로 두고, 호출 시 다음 단계를 수행합니다:
propertyKey 를 ? ToPropertyKey (key )로
둡니다.
! CreateDataPropertyOrThrow (obj ,
propertyKey , value )를 수행합니다.
NormalCompletion (undefined )를
반환합니다.
adder 를 CreateBuiltinFunction (closure ,
2, "" , « »)로 둡니다.
? AddEntriesFromIterable (obj ,
iterable , adder )를 반환합니다.
참고
adder 를 위해 생성된 함수는 ECMAScript 코드에서는 직접 접근할 수 없습니다.
20.1.2.8 Object.getOwnPropertyDescriptor ( O ,
P )
이 함수는 호출될 때 다음 단계를 수행합니다:
obj 를 ? ToObject (O )로 둡니다.
key 를 ? ToPropertyKey (P )로 둡니다.
desc 를 ? obj .[[GetOwnProperty]] (key )로 둡니다.
FromPropertyDescriptor (desc )를
반환합니다.
20.1.2.9 Object.getOwnPropertyDescriptors ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
obj 를 ? ToObject (O )로 둡니다.
ownKeys 를 ? obj .[[OwnPropertyKeys]] () 로 둡니다.
descriptors 를 OrdinaryObjectCreate (%Object.prototype% )로
둡니다.
ownKeys 의 각 요소 key 에 대해,
desc 를 ? obj .[[GetOwnProperty]] (key )로 둡니다.
descriptor 를 FromPropertyDescriptor (desc )로
둡니다.
descriptor 가 undefined 가 아니면,
! CreateDataPropertyOrThrow (descriptors ,
key , descriptor )를 수행합니다.
descriptors 를 반환합니다.
20.1.2.10 Object.getOwnPropertyNames ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
CreateArrayFromList (?
GetOwnPropertyKeys (O ,
string ))를 반환합니다.
20.1.2.11 Object.getOwnPropertySymbols ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
CreateArrayFromList (?
GetOwnPropertyKeys (O ,
symbol ))를 반환합니다.
20.1.2.11.1 GetOwnPropertyKeys ( O ,
type )
추상 연산 GetOwnPropertyKeys는 O (ECMAScript 언어
값 )
와 type (string 또는 symbol ) 인자를
받고, 정상 완료 로 리스트 의 속성 키 또는
throw 완료 를 반환합니다.
호출 시 다음 단계를 수행합니다:
obj 를 ? ToObject (O )로 둡니다.
keys 를 ? obj .[[OwnPropertyKeys]] () 로 둡니다.
nameList 를 새로운 빈 리스트 로 둡니다.
keys 의 각 요소 nextKey 에 대해,
nextKey 가 Symbol 이고
type 이
symbol 이거나, nextKey 가 문자열 이고
type 이
string 이면,
nextKey 를 nameList 에 추가합니다.
nameList 를 반환합니다.
20.1.2.12 Object.getPrototypeOf ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
obj 를 ? ToObject (O )로 둡니다.
? obj .[[GetPrototypeOf]] () 를 반환합니다.
20.1.2.13 Object.groupBy ( items , callback
)
참고
callback 은 두 개의 인자를 받아야 하는 함수여야 합니다.
groupBy는 items 의 각 요소에 대해 오름차순으로 callback 을 한 번씩
호출해서 새 객체를 만듭니다. callback 이 반환한 각 값은 속성 키 로 강제 변환됩니다. 이렇게 변환된 각
속성
키 에 대해, 결과 객체는 해당 속성 키 를 가지고, 값은
callback 의 반환값이 그 키로 강제 변환된 모든 요소를 담은 배열입니다.
callback 은 두 인자(요소의 값, 요소의 인덱스)로 호출됩니다.
groupBy의 반환값은 %Object.prototype% 를
상속받지 않는 객체입니다.
이 함수는 호출될 때 다음 단계를 수행합니다:
groups 를 ? GroupBy (items ,
callback , property )로 둡니다.
obj 를 OrdinaryObjectCreate (null )로
둡니다.
groups 의 각 Record { [[Key]] , [[Elements]] }
g 에 대해,
elements 를 CreateArrayFromList (g .[[Elements]] )로 둡니다.
! CreateDataPropertyOrThrow (obj ,
g .[[Key]] , elements )를 수행합니다.
obj 를 반환합니다.
20.1.2.14 Object.hasOwn ( O , P )
이 함수는 호출될 때 다음 단계를 수행합니다:
obj 를 ? ToObject (O )로 둡니다.
key 를 ? ToPropertyKey (P )로 둡니다.
? HasOwnProperty (obj ,
key )를 반환합니다.
20.1.2.15 Object.is ( value1 , value2 )
이 함수는 호출될 때 다음 단계를 수행합니다:
SameValue (value1 ,
value2 )를 반환합니다.
20.1.2.16 Object.isExtensible ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
O 가 객체가 아니면 , false 를
반환합니다.
? IsExtensible (O )를 반환합니다.
20.1.2.17 Object.isFrozen ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
O 가 객체가 아니면 , true 를
반환합니다.
? TestIntegrityLevel (O ,
frozen )를 반환합니다.
20.1.2.18 Object.isSealed ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
O 가 객체가 아니면 , true 를
반환합니다.
? TestIntegrityLevel (O ,
sealed )를 반환합니다.
20.1.2.19 Object.keys ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
obj 를 ? ToObject (O )로 둡니다.
keyList 를 ? EnumerableOwnProperties (obj ,
key )로 둡니다.
CreateArrayFromList (keyList )를
반환합니다.
20.1.2.20 Object.preventExtensions ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
O 가 객체가 아니면 , O 를 반환합니다.
status 를 ? O .[[PreventExtensions]] () 로 둡니다.
status 가 false 이면, TypeError 예외를
throw합니다.
O 를 반환합니다.
20.1.2.21 Object.prototype
Object.prototype의 초기값은 Object 프로토타입
객체 입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.1.2.22 Object.seal ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
O 가 객체가 아니면 , O 를 반환합니다.
status 를 ? SetIntegrityLevel (O ,
sealed )로 둡니다.
status 가 false 이면, TypeError 예외를
throw합니다.
O 를 반환합니다.
20.1.2.23 Object.setPrototypeOf ( O , proto
)
이 함수는 호출될 때 다음 단계를 수행합니다:
O 를 ? RequireObjectCoercible (O )로
설정합니다.
proto 가 객체가 아니고 proto 가
null 이 아니면, TypeError 예외를 throw합니다.
O 가 객체가 아니면 , O 를 반환합니다.
status 를 ? O .[[SetPrototypeOf]] (proto )로 둡니다.
status 가 false 이면, TypeError 예외를
throw합니다.
O 를 반환합니다.
20.1.2.24 Object.values ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
obj 를 ? ToObject (O )로 둡니다.
valueList 를 ? EnumerableOwnProperties (obj ,
value )로 둡니다.
CreateArrayFromList (valueList )를
반환합니다.
20.1.3 Object 프로토타입 객체의 속성
Object 프로토타입 객체 :
%Object.prototype% 입니다.
[[Extensible]] 내부 슬롯의 값은 true 입니다.
일반
객체 에 대해 정의된 내부 메서드를 가집니다. 단, [[SetPrototypeOf]] 메서드는 10.4.7.1 에서
정의된 대로입니다.
(따라서, 불변 프로토타입 이국 객체 입니다.)
[[Prototype]] 내부 슬롯의 값은 null 입니다.
20.1.3.1 Object.prototype.constructor
Object.prototype.constructor의 초기값은 %Object% 입니다.
20.1.3.2 Object.prototype.hasOwnProperty ( V )
이 메서드는 호출될 때 다음 단계를 수행합니다:
P 를 ? ToPropertyKey (V )로 둡니다.
O 를 ? ToObject (this 값)로
둡니다.
? HasOwnProperty (O ,
P )를 반환합니다.
참고
단계 1 와
2 의 순서는, 이전 명세에서
1 에서 던져졌던 예외가
this 값이 undefined 또는
null 일 때에도 계속 던져질 수 있도록 보장하기 위해 선택되었습니다.
20.1.3.3 Object.prototype.isPrototypeOf ( V )
이 메서드는 호출될 때 다음 단계를 수행합니다:
V 가 객체가 아니면 ,
false 를 반환합니다.
O 를 ? ToObject (this 값)로
둡니다.
반복,
V 를 ? V .[[GetPrototypeOf]] () 로 설정합니다.
V 가 null 이면, false 를 반환합니다.
SameValue (O ,
V )가 true 이면, true 를 반환합니다.
참고
단계 1 와
2 의 순서는, V 가 객체가
아닌 경우와 this 값이 undefined 또는
null 일 때 이전 명세에서 지정된 동작을 유지합니다.
20.1.3.4 Object.prototype.propertyIsEnumerable ( V )
이 메서드는 호출될 때 다음 단계를 수행합니다:
P 를 ? ToPropertyKey (V )로 둡니다.
O 를 ? ToObject (this 값)로
둡니다.
desc 를 ? O .[[GetOwnProperty]] (P )로 둡니다.
desc 가 undefined 면, false 를 반환합니다.
desc .[[Enumerable]] 를 반환합니다.
참고 1
이 메서드는 프로토타입 체인의 객체는 고려하지 않습니다.
참고 2
단계 1 와
2 의 순서는, 이전 명세에서
1 에서 던져졌던 예외가
this 값이 undefined 또는 null 일
때에도 계속 던져질 수 있도록 보장하기 위해 선택되었습니다.
20.1.3.5 Object.prototype.toLocaleString ( [
reserved1 [ , reserved2 ] ] )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 this 값으로 둡니다.
? Invoke (O ,
"toString" )을 반환합니다.
이 메서드의 선택적 매개변수는 사용되지 않지만 ECMA-402 toLocaleString 메서드에서 사용된 매개변수 패턴과 일치하도록
설계되었습니다. ECMA-402 지원이 없는 구현은 이 매개변수 위치를 다른 용도로 사용하면 안 됩니다.
참고 1
이 메서드는 로케일에 민감한 toString 동작이 없는 객체에 대해 일반적인 toLocaleString
구현을 제공합니다. Array, Number, Date 및 %TypedArray% 는 자체
로케일에 민감한 toLocaleString 메서드를 제공합니다.
참고 2
ECMA-402는 이 기본 구현의 대안을 의도적으로 제공하지 않습니다.
20.1.3.6 Object.prototype.toString ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
this 값이 undefined 이면, "[object
Undefined]" 를 반환합니다.
this 값이 null 이면, "[object
Null]" 를 반환합니다.
O 를 ! ToObject (this 값)로
둡니다.
isArray 를 ? IsArray (O )로 둡니다.
isArray 가 true 이면, builtinTag 를
"Array" 로 둡니다.
그렇지 않고 O 에 [[ParameterMap]] 내부 슬롯이 있으면,
builtinTag 를 "Arguments" 로 둡니다.
그렇지 않고 O 에 [[Call]] 내부 메서드가 있으면,
builtinTag 를 "Function" 로 둡니다.
그렇지 않고 O 에 [[ErrorData]] 내부 슬롯이 있으면,
builtinTag 를 "Error" 로 둡니다.
그렇지 않고 O 에 [[BooleanData]] 내부 슬롯이 있으면,
builtinTag 를 "Boolean" 로 둡니다.
그렇지 않고 O 에 [[NumberData]] 내부 슬롯이 있으면,
builtinTag 를 "Number" 로 둡니다.
그렇지 않고 O 에 [[StringData]] 내부 슬롯이 있으면,
builtinTag 를 "String" 로 둡니다.
그렇지 않고 O 에 [[DateValue]] 내부 슬롯이 있으면,
builtinTag 를 "Date" 로 둡니다.
그렇지 않고 O 에 [[RegExpMatcher]] 내부 슬롯이 있으면,
builtinTag 를 "RegExp" 로 둡니다.
그 외에는, builtinTag 를 "Object" 로 둡니다.
tag 를 ? Get (O ,
%Symbol.toStringTag% )로 둡니다.
tag 가 문자열이
아니면 , tag 를 builtinTag 로 설정합니다.
문자열 연결 로 "[object
" , tag , "]" 을 반환합니다.
참고
과거에는 이 메서드를 통해 이전 명세에서 여러 내장 객체의 명목 타입 태그로 사용되던 [[Class]] 내부
슬롯의 문자열 값을 접근하기도 했습니다. 위의 toString 정의는 toString을 특정 내장 객체
종류의 테스트로 사용하는 레거시 코드의 호환성을 유지합니다. 그러나, 다른 종류의 내장 객체나 프로그램 정의 객체에 대해서는 신뢰할 수 있는 타입 판별
메커니즘을 제공하지 않습니다. 또한, 프로그램에서 %Symbol.toStringTag% 를 사용하면 이러한
레거시 타입 테스트의 신뢰성을 무효화할 수 있습니다.
20.1.3.7 Object.prototype.valueOf ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
? ToObject (this 값)을
반환합니다.
20.1.3.8 Object.prototype.__proto__
Object.prototype.__proto__는 접근자 속성 이며, 특성은 { [[Enumerable]] : false , [[Configurable]] : true }입니다. [[Get]] 및 [[Set]] 특성은 다음과 같이 정의됩니다:
20.1.3.8.1 get Object.prototype.__proto__
[[Get]] 특성 값은 인자를 받지 않는 내장 함수입니다. 호출될 때 다음 단계를 수행합니다:
O 를 ? ToObject (this
값)로 둡니다.
? O .[[GetPrototypeOf]] () 을 반환합니다.
20.1.3.8.2 set Object.prototype.__proto__
[[Set]] 특성 값은 proto 인자를 받는 내장 함수입니다. 호출될 때 다음 단계를
수행합니다:
O 를 ? RequireObjectCoercible (this
값)로 둡니다.
proto 가 객체가 아니고 , proto 가
null 이 아니면, undefined 를 반환합니다.
O 가 객체가 아니면 ,
undefined 를 반환합니다.
status 를 ? O .[[SetPrototypeOf]] (proto )로 둡니다.
status 가 false 이면, TypeError 예외를
throw합니다.
undefined 를 반환합니다.
20.1.3.9 레거시 Object.prototype 접근자 메서드
20.1.3.9.1 Object.prototype.__defineGetter__ ( P ,
getter )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 ? ToObject (this
값)로 둡니다.
IsCallable (getter )가
false 면, TypeError 예외를 throw합니다.
desc 를 PropertyDescriptor { [[Get]] :
getter , [[Enumerable]] :
true , [[Configurable]] :
true }로 둡니다.
key 를 ? ToPropertyKey (P )로 둡니다.
? DefinePropertyOrThrow (O ,
key , desc )를 수행합니다.
undefined 를 반환합니다.
20.1.3.9.2 Object.prototype.__defineSetter__ ( P ,
setter )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 ? ToObject (this
값)로 둡니다.
IsCallable (setter )가
false 면, TypeError 예외를 throw합니다.
desc 를 PropertyDescriptor { [[Set]] :
setter , [[Enumerable]] :
true , [[Configurable]] :
true }로 둡니다.
key 를 ? ToPropertyKey (P )로 둡니다.
? DefinePropertyOrThrow (O ,
key , desc )를 수행합니다.
undefined 를 반환합니다.
20.1.3.9.3 Object.prototype.__lookupGetter__ ( P
)
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 ? ToObject (this
값)로 둡니다.
key 를 ? ToPropertyKey (P )로 둡니다.
반복,
desc 를 ? O .[[GetOwnProperty]] (key )로
둡니다.
desc 가 undefined 가 아니면,
IsAccessorDescriptor (desc )
가 true 면 desc .[[Get]] 를 반환합니다.
undefined 를 반환합니다.
O 를 ? O .[[GetPrototypeOf]] () 로 설정합니다.
O 가 null 이면, undefined 를
반환합니다.
20.1.3.9.4 Object.prototype.__lookupSetter__ ( P
)
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 ? ToObject (this
값)로 둡니다.
key 를 ? ToPropertyKey (P )로 둡니다.
반복,
desc 를 ? O .[[GetOwnProperty]] (key )로
둡니다.
desc 가 undefined 가 아니면,
IsAccessorDescriptor (desc )
가 true 면 desc .[[Set]] 를 반환합니다.
undefined 를 반환합니다.
O 를 ? O .[[GetPrototypeOf]] () 로 설정합니다.
O 가 null 이면, undefined 를
반환합니다.
20.1.4 객체 인스턴스의 속성
객체 인스턴스는 Object 프로토타입 객체 로부터
상속받은 것 이외에는 특별한 속성이 없습니다.
20.2 함수 객체
20.2.1 Function 생성자
Function 생성자 :
%Function% 입니다.
"Function" 속성의 초기값이며, 글로벌 객체 의 값입니다.
생성자 대신
함수로 호출될 때 새로운 함수
객체 를 생성하고 초기화합니다. 따라서 Function(…) 함수 호출은 동일한 인자를 가진
new Function(…) 객체 생성 표현식과 동일합니다.
클래스 정의의 extends 절의 값으로 사용할 수 있습니다. 지정된 Function 동작을 상속하려는 서브클래스 생성자 는 내장 함수 동작에
필요한 내부 슬롯을 가진 서브클래스 인스턴스를 생성 및 초기화하기 위해 반드시 Function 생성자 에 super 호출을 포함해야
합니다. 함수
객체 정의를 위한 모든 ECMAScript 구문은 Function의 인스턴스를 생성합니다. 내장
GeneratorFunction, AsyncFunction, AsyncGeneratorFunction 서브클래스를 제외하고 Function 서브클래스 인스턴스를
생성하는 구문은 없습니다.
20.2.1.1 Function ( ...parameterArgs ,
bodyArg )
마지막 인자(있다면)는 함수의 본문(실행 코드)을 지정합니다. 그 앞의 인자들은 형식 매개변수를 지정합니다.
이 함수는 호출될 때 다음 단계를 수행합니다:
C 를 활성 함수 객체 로 둡니다.
bodyArg 가 없으면 bodyArg 를 빈 문자열로 설정합니다.
? CreateDynamicFunction (C ,
NewTarget, normal , parameterArgs ,
bodyArg )를 반환합니다.
참고
각 형식 매개변수에 대해 인자를 하나씩 가지는 것은 허용되지만 필수는 아닙니다. 예를 들어, 아래 세 표현식은 모두 동일한 결과를 생성합니다:
new Function ("a" , "b" , "c" , "return a+b+c" )
new Function ("a, b, c" , "return a+b+c" )
new Function ("a,b" , "c" , "return a+b+c" )
20.2.1.1.1 CreateDynamicFunction ( constructor ,
newTarget , kind , parameterArgs , bodyArg )
추상 연산 CreateDynamicFunction은 constructor (생성자 ),
newTarget (생성자 또는 undefined ),
kind (normal , generator ,
async , async-generator ),
parameterArgs (리스트 의
ECMAScript 언어 값 ),
bodyArg (ECMAScript 언어 값 )을 인자로 받고,
정상 완료 로
ECMAScript 함수 객체 또는 throw 완료 를 반환합니다.
constructor 는 이 동작을 수행하는 생성자 함수입니다. newTarget 은 처음
new가 적용된 생성자 입니다. parameterArgs 와
bodyArg 는 constructor 에 전달된 인자 값을 반영합니다. 호출 시 다음 단계를 수행합니다:
newTarget 이 undefined 이면, newTarget 를
constructor 로 설정합니다.
kind 가 normal 이면,
prefix 를 "function" 로 둡니다.
exprSym 를 FunctionExpression 로
둡니다.
bodySym 를 FunctionBody [~Yield,
~Await] 로 둡니다.
parameterSym 를 FormalParameters [~Yield,
~Await] 로 둡니다.
fallbackProto 를
"%Function.prototype%" 로 둡니다.
그렇지 않고 kind 가 generator 이면,
prefix 를 "function*" 로 둡니다.
exprSym 를 GeneratorExpression 로
둡니다.
bodySym 를 GeneratorBody 로 둡니다.
parameterSym 를 FormalParameters [+Yield,
~Await] 로 둡니다.
fallbackProto 를
"%GeneratorFunction.prototype%" 로 둡니다.
그렇지 않고 kind 가 async 이면,
prefix 를 "async function" 로 둡니다.
exprSym 를 AsyncFunctionExpression 로
둡니다.
bodySym 를 AsyncFunctionBody 로
둡니다.
parameterSym 를 FormalParameters [~Yield,
+Await] 로 둡니다.
fallbackProto 를
"%AsyncFunction.prototype%" 로 둡니다.
그 외,
Assert : kind 는
async-generator 입니다.
prefix 를 "async function*" 로 둡니다.
exprSym 를 AsyncGeneratorExpression 로
둡니다.
bodySym 를 AsyncGeneratorBody 로
둡니다.
parameterSym 를 FormalParameters [+Yield,
+Await] 로 둡니다.
fallbackProto 를
"%AsyncGeneratorFunction.prototype%" 로 둡니다.
argCount 를 parameterArgs 의 요소 개수로 둡니다.
parameterStrings 를 새로운 빈 리스트 로 둡니다.
parameterArgs 의 각 요소 arg 에 대해,
? ToString (arg )를
parameterStrings 에 추가합니다.
bodyString 을 ? ToString (bodyArg )로 둡니다.
currentRealm 을 현재 Realm Record 로 둡니다.
? HostEnsureCanCompileStrings (currentRealm ,
parameterStrings , bodyString , false )를
수행합니다.
P 를 빈 문자열로 둡니다.
argCount > 0이면,
P 를 parameterStrings [0]로 설정합니다.
k 를 1로 둡니다.
k < argCount 인 동안 반복,
nextArgString 를
parameterStrings [k ]로 둡니다.
P 를 문자열
연결 로 P ,
"," (쉼표), nextArgString 의 연결로 설정합니다.
k 를 k + 1로 설정합니다.
bodyParseString 를 문자열 연결 로
0x000A(LINE FEED), bodyString , 0x000A(LINE FEED)의 연결로 둡니다.
sourceString 를 문자열 연결 로
prefix , " anonymous(" , P , 0x000A(LINE
FEED), ") {" , bodyParseString ,
"}" 의 연결로 둡니다.
sourceText 를 StringToCodePoints (sourceString )로
둡니다.
parameters 를 ParseText (P ,
parameterSym )로 둡니다.
parameters 가 리스트 의 오류라면,
SyntaxError 예외를 throw합니다.
body 를 ParseText (bodyParseString ,
bodySym )로 둡니다.
body 가 리스트 의 오류라면,
SyntaxError 예외를 throw합니다.
참고: 매개변수와 본문은 각각 단독으로 유효한지 확인하기 위해 따로 파싱됩니다. 예를 들어,
new Function("/*", "*/ ) {")는 함수로 평가되지 않습니다.
참고: 이 단계에 도달했다면 sourceText 는 exprSym 의 문법을 가져야 합니다(역은 성립하지
않음). 다음 두 단계의 목적은 exprSym 에 직접 적용되는 Early Error 규칙을 강제하는 것입니다.
expr 를 ParseText (sourceText ,
exprSym )로 둡니다.
expr 가 리스트 의 오류라면,
SyntaxError 예외를 throw합니다.
proto 를 ? GetPrototypeFromConstructor (newTarget ,
fallbackProto )로 둡니다.
env 를 currentRealm .[[GlobalEnv]] 로
둡니다.
privateEnv 를 null 로 둡니다.
F 를 OrdinaryFunctionCreate (proto ,
sourceText , parameters , body ,
non-lexical-this , env , privateEnv )로
둡니다.
SetFunctionName (F ,
"anonymous" )를 수행합니다.
kind 가 generator 이면,
prototype 를 OrdinaryObjectCreate (%GeneratorPrototype% )로
둡니다.
! DefinePropertyOrThrow (F ,
"prototype" , PropertyDescriptor { [[Value]] : prototype , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] :
false })를 수행합니다.
그렇지 않고 kind 가 async-generator 이면,
prototype 를 OrdinaryObjectCreate (%AsyncGeneratorPrototype% )로
둡니다.
! DefinePropertyOrThrow (F ,
"prototype" , PropertyDescriptor { [[Value]] : prototype , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] :
false })를 수행합니다.
그렇지 않고 kind 가 normal 이면,
MakeConstructor (F )를
수행합니다.
참고: kind 가 async 인 함수는 생성 불가능하며 [[Construct]] 내부 메서드나 "prototype" 속성을
갖지 않습니다.
F 를 반환합니다.
참고
CreateDynamicFunction은 kind 가 async 가 아닌 함수에 대해
"prototype" 속성을 정의하여 해당 함수가 생성자 로 사용될 수 있도록 합니다.
20.2.2 Function 생성자의 속성
Function 생성자 :
20.2.2.1 Function.prototype
Function.prototype의 값은 Function 프로토타입
객체 입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.2.3 Function 프로토타입 객체의 속성
Function 프로토타입 객체 :
%Function.prototype% 입니다.
자체적으로 내장 함수
객체 입니다.
어떤 인자도 받아들이며, 호출 시 undefined 를 반환합니다.
[[Construct]] 내부 메서드가 없으므로 new 연산자와 함께 생성자 로 사용할 수
없습니다.
[[Prototype]] 내부 슬롯의 값은 %Object.prototype% 입니다.
"prototype" 속성을 가지지 않습니다.
"length" 속성의 값은
+0 𝔽 입니다.
"name" 속성의 값은 빈 문자열입니다.
참고
Function 프로토타입 객체는 ECMAScript 2015 명세 이전에 작성된 ECMAScript 코드와의 호환성을 보장하기 위해 함수
객체 로 지정되어 있습니다.
20.2.3.1 Function.prototype.apply ( thisArg ,
argArray )
이 메서드는 호출될 때 다음 단계를 수행합니다:
func 를 this 값으로 둡니다.
IsCallable (func )가
false 이면, TypeError 예외를 throw합니다.
argArray 가 undefined 또는
null 이면,
PrepareForTailCall ()를
수행합니다.
? Call (func ,
thisArg )를 반환합니다.
argList 를 ? CreateListFromArrayLike (argArray )로
둡니다.
PrepareForTailCall ()를 수행합니다.
? Call (func ,
thisArg ,
argList )를 반환합니다.
참고 1
thisArg 값은 수정 없이 this 값으로 전달됩니다. 이는 Edition 3과의 변경사항으로,
Edition 3에서는 undefined 또는 null
thisArg 가 글로벌 객체 로 대체되고, 다른 값에는 ToObject 가
적용된 결과가 this 값으로 전달되었습니다. thisArg 가 수정 없이 전달되더라도,
strict하지 않은 함수 는 함수 진입 시 여전히 이러한
변환을 수행합니다.
참고 2
func 가 화살표 함수이거나 bound function exotic
object 라면, thisArg 는 6단계 6 의 [[Call]] 에서 무시됩니다.
20.2.3.2 Function.prototype.bind ( thisArg ,
...args )
이 메서드는 호출될 때 다음 단계를 수행합니다:
Target 를 this 값으로 둡니다.
IsCallable (Target )가
false 이면, TypeError 예외를 throw합니다.
F 를 ? BoundFunctionCreate (Target ,
thisArg , args )로 둡니다.
L 을 0으로 둡니다.
targetHasLength 를 ? HasOwnProperty (Target ,
"length" )로 둡니다.
targetHasLength 가 true 이면,
targetLen 를 ? Get (Target ,
"length" )로 둡니다.
targetLen 가 Number 이면,
targetLen 가 +∞ 𝔽 이면,
L 을 +∞로 설정합니다.
그렇지 않고 targetLen 가 -∞ 𝔽 이면,
L 을 0으로 설정합니다.
그 외에는,
targetLenAsInt 를 ! ToIntegerOrInfinity (targetLen )로
둡니다.
Assert :
targetLenAsInt 가 유한 입니다.
argCount 를 args 의 요소 개수로 둡니다.
L 을 max (targetLenAsInt
- argCount , 0)로 설정합니다.
SetFunctionLength (F ,
L )을 수행합니다.
targetName 를 ? Get (Target ,
"name" )로 둡니다.
targetName 가 문자열이
아니면 , targetName 을 빈 문자열로 설정합니다.
SetFunctionName (F ,
targetName , "bound" )을 수행합니다.
F 를 반환합니다.
참고 1
Function.prototype.bind를 사용해 생성된 함수 객체 는 이국
객체 입니다. 또한 "prototype" 속성을 가지지 않습니다.
참고 2
Target 이 화살표 함수이거나 bound function exotic
object 이면, 이 메서드에 전달된 thisArg 는 이후 F 를 호출할
때 사용되지 않습니다.
20.2.3.3 Function.prototype.call ( thisArg ,
...args )
이 메서드는 호출될 때 다음 단계를 수행합니다:
func 를 this 값으로 둡니다.
IsCallable (func )가
false 이면, TypeError 예외를 throw합니다.
PrepareForTailCall ()를 수행합니다.
? Call (func ,
thisArg ,
args )를 반환합니다.
참고 1
thisArg 값은 수정 없이 this 값으로 전달됩니다. 이는 Edition 3과의 변경사항으로,
Edition 3에서는 undefined 또는 null
thisArg 가 글로벌 객체 로 대체되고, 다른 값에는 ToObject 가
적용된 결과가 this 값으로 전달되었습니다. thisArg 가 수정 없이 전달되더라도,
strict하지 않은 함수 는 함수 진입 시 여전히 이러한
변환을 수행합니다.
참고 2
func 가 화살표 함수이거나 bound function exotic
object 라면, thisArg 는 4단계 4 의 [[Call]] 에서 무시됩니다.
20.2.3.4 Function.prototype.constructor
Function.prototype.constructor의 초기값은 %Function% 입니다.
20.2.3.5 Function.prototype.toString ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
func 를 this 값으로 둡니다.
func 가 객체 이고, func 에 [[SourceText]] 내부 슬롯이 있고, func .[[SourceText]] 가 유니코드 코드 포인트 시퀀스이고, HostHasSourceTextAvailable (func )
가 true 이면,
CodePointsToString (func .[[SourceText]] )를 반환합니다.
func 가 내장 함수 객체 이면,
func 의 구현 정의 문자열 소스코드 표현을 반환합니다. 표현은
NativeFunction
문법을 가져야 합니다. 또한, func 에 [[InitialName]] 내부 슬롯이
있고, func .[[InitialName]] 이 문자열 이면, 반환
문자열에서 NativeFunctionAccessor opt
PropertyName 에 해당하는
부분은 func .[[InitialName]] 이어야 합니다.
func 가 객체 이고, IsCallable (func )가
true 이면, func 의 구현 정의 문자열 소스코드
표현을 반환합니다. 표현은 NativeFunction 문법을 가져야 합니다.
TypeError 예외를 throw합니다.
NativeFunction :
function
NativeFunctionAccessor opt
PropertyName [~Yield,
~Await] opt
(
FormalParameters [~Yield,
~Await]
)
{
[
native
code
]
}
NativeFunctionAccessor
:
get
set
20.2.3.6 Function.prototype [ %Symbol.hasInstance% ] (
V )
이 메서드는 호출될 때 다음 단계를 수행합니다:
F 를 this 값으로 둡니다.
? OrdinaryHasInstance (F ,
V )를 반환합니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
참고
이것은 대부분의 함수가 상속받는 %Symbol.hasInstance%의 기본 구현입니다.
%Symbol.hasInstance%는 instanceof 연산자가 특정 생성자 의
인스턴스인지 판별하기 위해 호출됩니다. 예를 들면
v instanceof F
는 다음과 같이 평가됩니다:
F[%Symbol .hasInstance %](v)
생성자 함수는 함수에 다른
%Symbol.hasInstance% 메서드를 노출하여 어떤 객체가 instanceof로 자신의 인스턴스로 인식되는지 제어할 수
있습니다.
이 속성은 전역적으로 bound 함수의 타겟 함수를 노출할 수 있는 변조를 방지하기 위해 쓰기 불가능 및 설정 불가능입니다.
이 메서드의 "name" 속성 값은 "[Symbol.hasInstance]" 입니다.
20.2.4 함수 인스턴스
모든 Function 인스턴스는 ECMAScript 함수 객체 이며, 표 30 에 나열된 내부
슬롯을 가집니다.
Function
객체 는 Function.prototype.bind 메서드(20.2.3.2 )를 사용해 생성된 경우 표 31 에 나열된
내부 슬롯을 가집니다.
함수 인스턴스는 다음과 같은 속성을 가집니다:
20.2.4.1 length
"length" 속성의 값은 함수에서 일반적으로 기대되는 인자 수를 나타내는 정수
Number 입니다. 그러나 언어는 함수가 다른 개수의 인자로 호출되는 것을 허용합니다. 함수가
"length" 속성에 지정된 개수와 다른 인자 수로 호출될 때의 동작은 함수에 따라 다릅니다. 이 속성의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true }입니다.
20.2.4.2 name
"name" 속성의 값은 함수의 설명을 나타내는 문자열 입니다. 이름은 의미적
중요성을 가지지 않지만, 일반적으로 프로퍼티 이름 또는 함수가 ECMAScript 소스
텍스트 에서 정의된 위치에서 참조되는 변수명입니다. 이 속성의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true }입니다.
이 명세에 의해 컨텍스트 이름이 연관되지 않은 익명 함수 객체는 "name" 속성의 값으로 빈 문자열을 사용합니다.
20.2.4.3 prototype
생성자 로 사용할 수
있는 함수 인스턴스는 "prototype" 속성을 가집니다. 이러한 Function 인스턴스가 생성될 때마다, 또 다른
일반
객체 가 생성되어 함수의 "prototype" 속성의 초기값이 됩니다. 별도의 지정이 없는
한, "prototype" 속성 값은 해당 함수가 생성자 로 호출될 때 생성되는 객체의 [[Prototype]] 내부 슬롯을 초기화하는 데 사용됩니다.
이 속성의 특성은 { [[Writable]] :
true , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
참고
Function.prototype.bind로 생성된 함수 객체 나, MethodDefinition (단, GeneratorMethod 또는
AsyncGeneratorMethod 가 아닌 경우)
또는 ArrowFunction 을
평가하여 생성된 함수 객체는 "prototype" 속성을 가지지 않습니다.
20.2.5 HostHasSourceTextAvailable ( func )
호스트 정의 추상 연산
HostHasSourceTextAvailable은 func (함수 객체 ) 인자를 받아 불리언 값을 반환합니다. 이는 호스트 환경 이
func 에 대해 소스 텍스트 제공을 막을 수 있도록 합니다.
HostHasSourceTextAvailable의 구현은 다음 요구 사항을 충족해야 합니다:
매개변수에 대해 결정적이어야 합니다. 특정 func 인자로 호출될 때마다 항상 동일한 결과를 반환해야 합니다.
HostHasSourceTextAvailable의 기본 구현은 true 를 반환합니다.
20.3 Boolean 객체
20.3.1 Boolean 생성자
Boolean 생성자 :
%Boolean% 입니다.
"Boolean" 속성의 초기값이며, 글로벌 객체 의 값입니다.
생성자 로 호출될
때 새로운 Boolean 객체를 생성 및 초기화합니다.
생성자 대신
함수로 호출될 때 타입 변환을 수행합니다.
클래스 정의의 extends 절의 값으로 사용할 수 있습니다. 지정된 Boolean 동작을 상속하려는 서브클래스 생성자 는 [[BooleanData]] 내부 슬롯을 가진 서브클래스 인스턴스를 생성 및 초기화하기 위해 반드시 Boolean
생성자 에
super 호출을 포함해야 합니다.
20.3.1.1 Boolean ( value )
이 함수는 호출될 때 다음 단계를 수행합니다:
b 를 ToBoolean (value )로 둡니다.
NewTarget이 undefined 이면, b 를 반환합니다.
O 를 ? OrdinaryCreateFromConstructor (NewTarget,
"%Boolean.prototype%" , « [[BooleanData]] »)로 둡니다.
O .[[BooleanData]] 에 b 를 설정합니다.
O 를 반환합니다.
20.3.2 Boolean 생성자의 속성
Boolean 생성자 :
20.3.2.1 Boolean.prototype
Boolean.prototype의 초기값은 Boolean 프로토타입
객체 입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.3.3 Boolean 프로토타입 객체의 속성
Boolean 프로토타입 객체 :
%Boolean.prototype% 입니다.
일반
객체 입니다.
자체적으로 Boolean 객체이며, [[BooleanData]] 내부 슬롯의 값은
false 입니다.
[[Prototype]] 내부 슬롯의 값은 %Object.prototype% 입니다.
20.3.3.1 Boolean.prototype.constructor
Boolean.prototype.constructor의 초기값은 %Boolean% 입니다.
20.3.3.2 Boolean.prototype.toString ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
b 를 ? ThisBooleanValue (this
값)로 둡니다.
b 가 true 면 "true" 를 반환하고, 아니면
"false" 를 반환합니다.
20.3.3.3 Boolean.prototype.valueOf ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
? ThisBooleanValue (this
값)을 반환합니다.
20.3.3.3.1 ThisBooleanValue ( value )
추상 연산 ThisBooleanValue는 value (ECMAScript 언어
값 ) 인자를 받아 정상 완료 로 Boolean
또는 throw 완료 를 반환합니다.
호출 시 다음 단계를 수행합니다:
value 가 Boolean 이면,
value 를 반환합니다.
value 가 객체 이고 value
에 [[BooleanData]] 내부 슬롯이 있으면,
b 를 value .[[BooleanData]] 로
둡니다.
Assert : b 가 Boolean 임을
보장합니다.
b 를 반환합니다.
TypeError 예외를 throw합니다.
20.3.4 Boolean 인스턴스의 속성
Boolean 인스턴스는 일반
객체 이며, Boolean 프로토타입
객체 로부터 속성을 상속받습니다. Boolean 인스턴스는 [[BooleanData]]
내부 슬롯을 가집니다. [[BooleanData]] 내부 슬롯은 이 Boolean 객체가 표현하는 Boolean 값입니다.
20.4 Symbol 객체
20.4.1 Symbol 생성자
Symbol 생성자 :
%Symbol% 입니다.
"Symbol" 속성의 초기값이며, 글로벌 객체 의 값입니다.
함수로 호출될 때 새로운 Symbol 값을 반환합니다.
new 연산자와 함께 사용하는 것은 의도되지 않았습니다.
서브클래싱을 목적으로 하지 않습니다.
클래스 정의의 extends 절의 값으로 사용할 수 있지만, super 호출 시 예외가 발생합니다.
20.4.1.1 Symbol ( [ description ] )
이 함수는 호출될 때 다음 단계를 수행합니다:
NewTarget이 undefined 가 아니면, TypeError 예외를
throw합니다.
description 이 undefined 면, descString 을
undefined 로 둡니다.
그 외에는, descString 을 ? ToString (description )로 둡니다.
[[Description]] 이 descString 인 새로운 Symbol을 반환합니다.
20.4.2 Symbol 생성자의 속성
Symbol 생성자 :
20.4.2.1 Symbol.asyncIterator
Symbol.asyncIterator의 초기값은 well-known symbol %Symbol.asyncIterator% (표
1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.2 Symbol.for ( key )
이 함수는 호출될 때 다음 단계를 수행합니다:
stringKey 를 ? ToString (key )로 둡니다.
GlobalSymbolRegistry
List 의 각 요소 e 에 대해,
e .[[Key]] 가 stringKey 와 같으면,
e .[[Symbol]] 을 반환합니다.
Assert :
GlobalSymbolRegistry List 에 현재
stringKey 에 대한 항목이 없습니다.
newSymbol 을 [[Description]] 이
stringKey 인 새로운 Symbol로 둡니다.
GlobalSymbolRegistry에 Record { [[Key]] : stringKey , [[Symbol]] : newSymbol }를 추가합니다.
newSymbol 을 반환합니다.
GlobalSymbolRegistry List 는 전역적으로 사용 가능한 append-only 리스트 입니다. 모든 realm 에서 공유됩니다. ECMAScript
코드가 평가되기 전에 새로운 빈 리스트 로 초기화됩니다.
GlobalSymbolRegistry List의 요소는 Record 이며, 표
63 에 정의된 구조를 가집니다.
표 63: GlobalSymbolRegistry Record 필드
필드 이름
값
용도
[[Key]]
문자열
Symbol을 전역적으로 식별하는 데 사용되는 문자열 키.
[[Symbol]]
Symbol
어떤 realm 에서도 검색할 수 있는 symbol.
20.4.2.3 Symbol.hasInstance
Symbol.hasInstance의 초기값은 well-known symbol %Symbol.hasInstance% (표
1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.4 Symbol.isConcatSpreadable
Symbol.isConcatSpreadable의 초기값은 well-known symbol
%Symbol.isConcatSpreadable% (표
1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.5 Symbol.iterator
Symbol.iterator의 초기값은 well-known symbol %Symbol.iterator%
(표 1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.6 Symbol.keyFor ( sym )
이 함수는 호출될 때 다음 단계를 수행합니다:
sym 이 Symbol이
아니면 , TypeError 예외를 throw합니다.
KeyForSymbol (sym )을 반환합니다.
20.4.2.7 Symbol.match
Symbol.match의 초기값은 well-known symbol %Symbol.match%
(표 1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.8 Symbol.matchAll
Symbol.matchAll의 초기값은 well-known symbol %Symbol.matchAll%
(표 1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.9 Symbol.prototype
Symbol.prototype의 초기값은 Symbol 프로토타입
객체 입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.10 Symbol.replace
Symbol.replace의 초기값은 well-known symbol %Symbol.replace%
(표 1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.11 Symbol.search
Symbol.search의 초기값은 well-known symbol %Symbol.search%
(표 1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.12 Symbol.species
Symbol.species의 초기값은 well-known symbol %Symbol.species%
(표 1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.13 Symbol.split
Symbol.split의 초기값은 well-known symbol %Symbol.split%
(표 1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.14 Symbol.toPrimitive
Symbol.toPrimitive의 초기값은 well-known symbol %Symbol.toPrimitive% (표
1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.15 Symbol.toStringTag
Symbol.toStringTag의 초기값은 well-known symbol %Symbol.toStringTag% (표
1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.16 Symbol.unscopables
Symbol.unscopables의 초기값은 well-known symbol %Symbol.unscopables% (표
1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.3 Symbol 프로토타입 객체의 속성
Symbol 프로토타입 객체 :
20.4.3.1 Symbol.prototype.constructor
Symbol.prototype.constructor의 초기값은 %Symbol% 입니다.
20.4.3.2 get Symbol.prototype.description
Symbol.prototype.description은 접근자 속성 이며, set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출될 때 다음 단계를 수행합니다:
s 를 this 값으로 둡니다.
sym 을 ? ThisSymbolValue (s )로
둡니다.
sym .[[Description]] 을 반환합니다.
20.4.3.3 Symbol.prototype.toString ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
sym 을 ? ThisSymbolValue (this
값)으로 둡니다.
SymbolDescriptiveString (sym )을
반환합니다.
20.4.3.3.1 SymbolDescriptiveString ( sym )
추상 연산 SymbolDescriptiveString은 sym (Symbol)을 인자로 받아 문자열을 반환합니다. 호출 시 다음 단계를
수행합니다:
desc 를 sym 의 [[Description]] 값으로
둡니다.
desc 가 undefined 이면, desc 를 빈 문자열로 설정합니다.
Assert :
desc 는 문자열 입니다.
문자열 연결 로
"Symbol(" , desc , ")" 을 반환합니다.
20.4.3.4 Symbol.prototype.valueOf ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
? ThisSymbolValue (this
값)을 반환합니다.
20.4.3.4.1 ThisSymbolValue ( value )
추상 연산 ThisSymbolValue는 value (ECMAScript 언어
값 ) 인자를 받아 정상 완료 로 Symbol 또는
throw 완료 를 반환합니다.
호출 시 다음 단계를 수행합니다:
value 가 Symbol 이면,
value 를 반환합니다.
value 가 객체 이고 value
에 [[SymbolData]] 내부 슬롯이 있으면,
s 를 value .[[SymbolData]] 로
둡니다.
Assert : s 가 Symbol 임을
보장합니다.
s 를 반환합니다.
TypeError 예외를 throw합니다.
20.4.3.5 Symbol.prototype [ %Symbol.toPrimitive% ] (
hint )
이 메서드는 ECMAScript 언어 연산자가 Symbol 객체를 프리미티브 값으로 변환하기 위해 호출합니다.
호출될 때 다음 단계를 수행합니다:
? ThisSymbolValue (this
값)을 반환합니다.
참고
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }입니다.
이 메서드의 "name" 속성 값은 "[Symbol.toPrimitive]" 입니다.
20.4.3.6 Symbol.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 속성의 초기값은 문자열 값
"Symbol" 입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }입니다.
20.4.4 Symbol 인스턴스의 속성
Symbol 인스턴스는 일반
객체 이며, Symbol 프로토타입
객체 로부터 속성을 상속받습니다. Symbol 인스턴스는 [[SymbolData]] 내부
슬롯을 가집니다. [[SymbolData]] 내부 슬롯은 이 Symbol 객체가 표현하는 Symbol 값입니다.
20.4.5 심볼을 위한 추상 연산
20.4.5.1 KeyForSymbol ( sym )
추상 연산 KeyForSymbol은 sym (Symbol)을 인자로 받아 문자열 또는 undefined 를
반환합니다. sym 이 GlobalSymbolRegistry 리스트 에 있으면, sym 을
등록할 때 사용한 문자열을 반환합니다. 호출 시 다음 단계를 수행합니다:
GlobalSymbolRegistry 리스트 의 각 요소
e 에 대해,
SameValue (e .[[Symbol]] , sym )이
true 이면, e .[[Key]] 를
반환합니다.
Assert :
GlobalSymbolRegistry 리스트 는 현재
sym 에 대한 엔트리를 포함하지 않습니다.
undefined 를 반환합니다.
20.5 오류 객체
오류 객체의 인스턴스는 런타임 오류가 발생할 때 예외로 throw됩니다. 오류 객체는 사용자 정의 예외 클래스의 기본 객체로도 사용될 수 있습니다.
ECMAScript 구현에서 런타임 오류를 감지하면 20.5.5 에서
정의된 NativeError 객체 중 하나의 새 인스턴스 또는 20.5.7 에서 정의된 AggregateError
객체의 새 인스턴스를 throw합니다.
20.5.1 Error 생성자
Error 생성자 :
%Error% 입니다.
전역
객체 의 "Error" 프로퍼티의 초기 값입니다.
생성자가 아닌 함수로 호출될 때 새로운 Error 객체를 생성 및 초기화합니다. 따라서 Error(…) 함수 호출은 동일한 인자로
new Error(…) 객체 생성 표현식과 동일합니다.
클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 Error 동작을 상속하려는 서브클래스 생성자 는 [[ErrorData]] 내부 슬롯이 있는 서브클래스 인스턴스를 생성 및 초기화하기 위해 Error 생성자 에
super 호출을 포함해야 합니다.
20.5.1.1 Error ( message [ , options ] )
이 함수가 호출될 때 다음 단계를 수행합니다:
NewTarget이 undefined 이면 newTarget 을 활성 함수 객체 로 설정하고, 아니면
newTarget 을 NewTarget으로 설정합니다.
O 를 ? OrdinaryCreateFromConstructor (newTarget ,
"%Error.prototype%" , « [[ErrorData]] »)로 설정합니다.
message 가 undefined 가 아니면,
msg 를 ? ToString (message )로
설정합니다.
CreateNonEnumerableDataPropertyOrThrow (O ,
"message" , msg )를 수행합니다.
? InstallErrorCause (O ,
options )를 수행합니다.
O 를 반환합니다.
20.5.2 Error 생성자의 프로퍼티
Error 생성자 :
20.5.2.1 Error.isError ( arg )
이 함수가 호출될 때 다음 단계를 수행합니다:
arg 가 객체가 아니면 false 를
반환합니다.
arg 에 [[ErrorData]] 내부 슬롯이 없으면
false 를 반환합니다.
true 를 반환합니다.
20.5.2.2 Error.prototype
Error.prototype의 초기 값은 Error 프로토타입
객체 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.5.3 Error 프로토타입 객체의 프로퍼티
Error 프로토타입 객체 :
%Error.prototype% 입니다.
일반
객체 입니다.
Error 인스턴스가 아니며 [[ErrorData]] 내부 슬롯을 갖지 않습니다.
[[Prototype]] 내부 슬롯의 값은 %Object.prototype% 입니다.
20.5.3.1 Error.prototype.constructor
Error.prototype.constructor의 초기 값은 %Error% 입니다.
20.5.3.2 Error.prototype.message
Error.prototype.message의 초기 값은 빈 문자열입니다.
20.5.3.3 Error.prototype.name
Error.prototype.name의 초기 값은 "Error" 입니다.
20.5.3.4 Error.prototype.toString ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 this 값으로 설정합니다.
O 가 객체가 아니면 TypeError
예외를 throw합니다.
name 을 ? Get (O ,
"name" )으로 설정합니다.
name 이 undefined 이면 name 을
"Error" 로, 아니면 ? ToString (name )으로 설정합니다.
msg 를 ? Get (O ,
"message" )로 설정합니다.
msg 가 undefined 이면 msg 를 빈 문자열로, 아니면
? ToString (msg )로 설정합니다.
name 이 빈 문자열이면 msg 를 반환합니다.
msg 가 빈 문자열이면 name 을 반환합니다.
name 과 코드 유닛 0x003A (COLON), 코드 유닛 0x0020 (SPACE), 그리고 msg 를
문자열 연결 해서 반환합니다.
20.5.4 오류 인스턴스의 프로퍼티
오류 인스턴스는 일반
객체 로, Error 프로토타입
객체 로부터 프로퍼티를 상속하고, [[ErrorData]] 내부 슬롯의 값은
undefined 입니다. [[ErrorData]] 의 유일하게 명시된 사용은
Object.prototype.toString 및 Error.isError에서 Error, AggregateError, 그리고
NativeError 인스턴스를 Error 객체로 식별하는 것입니다.
20.5.5 이 표준에서 사용되는 네이티브 오류 타입
런타임 오류가 감지되면 아래의 NativeError 객체 또는 AggregateError 객체의 새 인스턴스가 throw됩니다. 모든
NativeError 객체는 20.5.6 에서 설명된 동일한 구조를 공유합니다.
20.5.5.1 EvalError
EvalError 생성자 는 %EvalError% 입니다.
이 예외는 현재 명세에서 사용되지 않습니다. 이 객체는 이전 버전과의 호환성을 위해 남아 있습니다.
20.5.5.2 RangeError
RangeError 생성자 는 %RangeError% 입니다.
허용되는 값의 집합 또는 범위에 속하지 않는 값을 나타냅니다.
20.5.5.3 ReferenceError
ReferenceError 생성자 는 %ReferenceError% 입니다.
잘못된 참조가 감지되었음을 나타냅니다.
20.5.5.4 SyntaxError
SyntaxError 생성자 는 %SyntaxError% 입니다.
파싱 오류가 발생했음을 나타냅니다.
20.5.5.5 TypeError
TypeError 생성자 는 %TypeError% 입니다.
다른 NativeError 객체가 실패 원인을 적절하게 나타내지 않을 때, TypeError는 실패 원인을 나타내기 위해 사용됩니다.
20.5.5.6 URIError
URIError 생성자 는 %URIError% 입니다.
전역 URI 처리 함수 중 하나가 그 정의와 호환되지 않는 방식으로 사용됐음을 나타냅니다.
20.5.6 NativeError 객체 구조
이 객체들은 아래에 설명된 구조를 가지며, 생성자 이름과 프로토타입 객체의 "name" 프로퍼티에서만 이름이 다릅니다.
각 오류 객체에 대해 정의에서 NativeError 에 대한 참조는 20.5.5 의 해당 오류 객체
이름으로 대체되어야 합니다.
20.5.6.1 NativeError 생성자
각 NativeError 생성자 :
생성자가 아닌 함수로 호출될 때 새로운 NativeError 객체를 생성 및 초기화합니다. 객체를 함수로 호출하는 것은 동일한 인자로
생성자 로
호출하는 것과 동일합니다. 따라서 NativeError (…) 함수 호출은 동일한 인자로
new NativeError (…) 객체 생성 표현식과 동일합니다.
클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 NativeError 동작을 상속하려는
서브클래스 생성자 는 [[ErrorData]]
내부 슬롯이 있는 서브클래스 인스턴스를 생성 및 초기화하기 위해 NativeError 생성자 에 super 호출을
포함해야 합니다.
20.5.6.1.1 NativeError ( message [ ,
options ] )
각 NativeError 함수는 호출될 때 다음 단계를 수행합니다:
NewTarget이 undefined 이면 newTarget 을 활성 함수 객체 로 설정하고, 아니면
newTarget 을 NewTarget으로 설정합니다.
O 를
? OrdinaryCreateFromConstructor (newTarget ,
"%NativeError .prototype%", « [[ErrorData]] »)로 설정합니다.
message 가 undefined 가 아니면,
msg 를 ? ToString (message )로
설정합니다.
CreateNonEnumerableDataPropertyOrThrow (O ,
"message" , msg )를 수행합니다.
? InstallErrorCause (O ,
options )를 수행합니다.
O 를 반환합니다.
2 단계에 전달되는
문자열의 실제 값은 "%EvalError.prototype%" ,
"%RangeError.prototype%" ,
"%ReferenceError.prototype%" ,
"%SyntaxError.prototype%" ,
"%TypeError.prototype%" , 또는 "%URIError.prototype%"
중 하나로, 정의되는 NativeError 생성자 에 해당합니다.
20.5.6.2 NativeError 생성자의 프로퍼티
각 NativeError 생성자 :
[[Prototype]] 내부 슬롯의 값은 %Error% 입니다.
"name" 프로퍼티 값은 문자열 값 "NativeError " 입니다.
다음 프로퍼티를 가집니다:
20.5.6.2.1 NativeError .prototype
NativeError .prototype의 초기 값은 NativeError 프로토타입 객체
(20.5.6.3 )입니다.
각 NativeError 생성자 는 고유한 프로토타입 객체를 가집니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] :
false , [[Configurable]] :
false }입니다.
20.5.6.3 NativeError 프로토타입 객체의 프로퍼티
각 NativeError 프로토타입 객체 :
20.5.6.3.1 NativeError .prototype.constructor
특정 NativeError 생성자 의 프로토타입의 "constructor"
프로퍼티의 초기 값은 생성자 자체입니다.
20.5.6.3.2 NativeError .prototype.message
특정 NativeError 생성자 의 프로토타입의 "message"
프로퍼티의 초기 값은 빈 문자열입니다.
20.5.6.3.3 NativeError .prototype.name
특정 NativeError 생성자 의 프로토타입의 "name" 프로퍼티의
초기 값은 생성자 의 이름(정의 시 NativeError 대신 사용된
이름)입니다.
20.5.6.4 NativeError 인스턴스의 프로퍼티
NativeError 인스턴스는 일반 객체 로, 고유한 NativeError 프로토타입
객체로부터 프로퍼티를 상속하고 [[ErrorData]] 내부 슬롯의 값은
undefined 입니다. [[ErrorData]] 의 유일하게 명시된 사용은
Object.prototype.toString
(20.1.3.6 ) 및
Error.isError (20.5.2.1 )에서 Error,
AggregateError 또는 NativeError 인스턴스를 식별하는 것입니다.
20.5.7 AggregateError 객체
20.5.7.1 AggregateError 생성자
AggregateError 생성자 :
%AggregateError% 입니다.
전역
객체 의 "AggregateError" 프로퍼티의 초기 값입니다.
생성자가 아닌 함수로 호출될 때 새로운 AggregateError 객체를 생성 및 초기화합니다. 따라서 AggregateError(…)
함수 호출은 동일한 인자로 new AggregateError(…) 객체 생성 표현식과 동일합니다.
클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 AggregateError 동작을 상속하려는 서브클래스
생성자 는
[[ErrorData]] 내부 슬롯이 있는 서브클래스 인스턴스를 생성 및 초기화하기 위해
AggregateError 생성자 에 super 호출을 포함해야 합니다.
20.5.7.1.1 AggregateError ( errors ,
message [ , options ] )
이 함수가 호출될 때 다음 단계를 수행합니다:
NewTarget이 undefined 이면 newTarget 을 활성 함수 객체 로 설정하고, 아니면
newTarget 을 NewTarget으로 설정합니다.
O 를 ? OrdinaryCreateFromConstructor (newTarget ,
"%AggregateError.prototype%" , « [[ErrorData]] »)로 설정합니다.
message 가 undefined 가 아니면,
msg 를 ? ToString (message )로
설정합니다.
CreateNonEnumerableDataPropertyOrThrow (O ,
"message" , msg )를 수행합니다.
? InstallErrorCause (O ,
options )를 수행합니다.
errorsList 를 ? IteratorToList (? GetIterator (errors ,
sync ))로 설정합니다.
! DefinePropertyOrThrow (O ,
"errors" , PropertyDescriptor { [[Configurable]] : true , [[Enumerable]] : false , [[Writable]] : true , [[Value]] : CreateArrayFromList (errorsList ) }를
수행합니다.
O 를 반환합니다.
20.5.7.2 AggregateError 생성자의 프로퍼티
AggregateError 생성자 :
[[Prototype]] 내부 슬롯의 값은 %Error% 입니다.
다음 프로퍼티를 가집니다:
20.5.7.2.1 AggregateError.prototype
AggregateError.prototype의 초기 값은 %AggregateError.prototype% 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] :
false , [[Configurable]] :
false }입니다.
20.5.7.3 AggregateError 프로토타입 객체의 프로퍼티
AggregateError 프로토타입 객체 :
%AggregateError.prototype% 입니다.
일반
객체 입니다.
Error 인스턴스나 AggregateError 인스턴스가 아니며 [[ErrorData]] 내부 슬롯을 갖지
않습니다.
[[Prototype]] 내부 슬롯의 값은 %Error.prototype% 입니다.
20.5.7.3.1 AggregateError.prototype.constructor
AggregateError.prototype.constructor의 초기 값은 %AggregateError% 입니다.
20.5.7.3.2 AggregateError.prototype.message
AggregateError.prototype.message의 초기 값은 빈 문자열입니다.
20.5.7.3.3 AggregateError.prototype.name
AggregateError.prototype.name의 초기 값은
"AggregateError" 입니다.
20.5.7.4 AggregateError 인스턴스의 프로퍼티
AggregateError 인스턴스는 일반 객체 로, AggregateError 프로토타입
객체 로부터 프로퍼티를 상속하고 [[ErrorData]]
내부 슬롯의 값은 undefined 입니다. [[ErrorData]] 의 유일하게 명시된
사용은 Object.prototype.toString
(20.1.3.6 ) 및
Error.isError (20.5.2.1 )에서 Error,
AggregateError 또는 NativeError 인스턴스를 식별하는 것입니다.
20.5.8 오류 객체를 위한 추상 연산
20.5.8.1 InstallErrorCause ( O , options )
추상 연산 InstallErrorCause는 O (객체)와 options (ECMAScript 언어 값 )를 인자로 받아
unused를 포함하는 정상 완료
또는 throw 완료 를 반환합니다.
options 에 "cause" 프로퍼티가 있을 때 O 에
"cause" 프로퍼티를 생성하기 위해 사용됩니다. 호출 시 다음 단계를 수행합니다:
options 가 객체이고 ? HasProperty (options ,
"cause" )가 true 이면,
cause 를 ? Get (options ,
"cause" )로 설정합니다.
CreateNonEnumerableDataPropertyOrThrow (O ,
"cause" , cause )를 수행합니다.
unused 를 반환합니다.
21 숫자와 날짜
21.1 Number 객체
21.1.1 Number 생성자
Number 생성자 :
%Number% 임.
"Number" 속성의 초기값임 글로벌 객체 의.
생성자 로 호출될
때 새로운 Number 객체를 생성하고 초기화함.
함수로 호출될 때 타입 변환을 수행함, 생성자 로 호출되는 것이 아니라면.
클래스 정의의 extends 절 값으로 사용될 수 있음. Number 생성자 에 대한 super 호출을 포함해야
하며, [[NumberData]] 내부 슬롯으로 서브클래스 인스턴스를 생성/초기화함.
21.1.1.1 Number ( value )
이 함수는 호출 시 다음 단계를 수행함:
value 가 존재하면,
prim 에 ? ToNumeric (value )를
할당한다.
prim BigInt인
경우 , n 에 𝔽 (ℝ (prim ))을 할당한다.
그렇지 않으면 n 에 prim 을 할당한다.
그렇지 않으면,
n 에 +0 𝔽 을 할당한다.
NewTarget이 undefined 라면 n 을 반환한다.
O 에 ? OrdinaryCreateFromConstructor (NewTarget,
"%Number.prototype%" , « [[NumberData]] » )를 할당한다.
O .[[NumberData]] 를 n 으로 설정한다.
O 를 반환한다.
21.1.2 Number 생성자의 속성
Number 생성자 :
21.1.2.1 Number.EPSILON
Number.EPSILON의 값은 Number 값 중 1과 1보다 큰 가장 작은 값의 차이의 크기이며, 이는 약
2.2204460492503130808472633361816 × 10-16 임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.1.2.2 Number.isFinite ( number )
이 함수는 호출 시 다음 단계를 수행함:
number 가 Number가
아니면 , false 를 반환한다.
number 가 유한 값이
아니면 , false 를 반환한다.
그렇지 않으면 true 를 반환한다.
21.1.2.3 Number.isInteger ( number )
이 함수는 호출 시 다음 단계를 수행함:
number 가 정수 Number 라면, true 를
반환한다.
false 를 반환한다.
21.1.2.4 Number.isNaN ( number )
이 함수는 호출 시 다음 단계를 수행함:
number 가 Number가
아니면 , false 를 반환한다.
number 가 NaN 이면, true 를 반환한다.
그렇지 않으면 false 를 반환한다.
참고
이 함수는 전역 isNaN 함수 (19.2.3 )와 다르게, 인수를 Number로 변환하지 않고
NaN 여부를 판단함.
21.1.2.5 Number.isSafeInteger ( number )
참고
정수
n 이 " 안전한 정수 "이려면 Number
값 n 이 Number 값 인 다른 정수 와 같지 않아야 함.
이 함수는 호출 시 다음 단계를 수행함:
number 가 정수 Number 이면,
abs (ℝ (number )) ≤
253 - 1이면, true 를 반환한다.
false 를 반환한다.
21.1.2.6 Number.MAX_SAFE_INTEGER
참고
IEEE
754-2019 의 정밀도 제한으로 인해, Number 값 이 정수
Number.MAX_SAFE_INTEGER보다 크면, 적어도 하나의 다른 정수 와 값을 공유하게 된다.
이런 큰 정수 는
안전하지
않음 이며, Number 값으로 정확히 표현되거나 서로 구분될 것이라 보장할 수 없음. 예시로
9007199254740992와 9007199254740993 모두
9007199254740992 𝔽 값을 가짐.
Number.MAX_SAFE_INTEGER의 값은
9007199254740991 𝔽 (𝔽 (253 - 1))임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.1.2.7 Number.MAX_VALUE
Number.MAX_VALUE의 값은 유한 한 값 중 Number 타입 의 가장 큰 양수
값이며, 이는 약 1.7976931348623157 × 10308 임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.1.2.8 Number.MIN_SAFE_INTEGER
참고
IEEE
754-2019 의 정밀도 제한으로 인해, Number 값 이 정수
Number.MIN_SAFE_INTEGER보다 작으면, 적어도 하나의 다른 정수 와 값을 공유하게 된다.
이런 큰 음수 정수 는 안전하지 않음 이며, Number 값으로 정확히
표현되거나 서로 구분될 것이라 보장할 수 없음. 예시로 -9007199254740992와
-9007199254740993 모두 -9007199254740992 𝔽
값을 가짐.
Number.MIN_SAFE_INTEGER의 값은
-9007199254740991 𝔽 (𝔽 (-(253 - 1)))임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.1.2.9 Number.MIN_VALUE
Number.MIN_VALUE의 값은 Number
타입 의 가장 작은 양수 값이며, 이는 약 5 ×
10-324 임.
IEEE
754-2019 의 배정밀도 이진 표현에서 가장 작은 값은 비정규화된 숫자임. 만약 구현이 비정규화 값을 지원하지 않으면
Number.MIN_VALUE의 값은 구현이 실제로 표현할 수 있는 가장 작은 0이 아닌 양수 값이어야 함.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.1.2.10 Number.NaN
Number.NaN의 값은 NaN 임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.1.2.11 Number.NEGATIVE_INFINITY
Number.NEGATIVE_INFINITY의 값은 -∞ 𝔽 임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.1.2.12 Number.parseFloat ( string )
"parseFloat" 속성의 초기값은 %parseFloat% 임.
21.1.2.13 Number.parseInt ( string , radix
)
"parseInt" 속성의 초기값은 %parseInt% 임.
21.1.2.14 Number.POSITIVE_INFINITY
Number.POSITIVE_INFINITY의 값은 +∞ 𝔽 임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.1.2.15 Number.prototype
Number.prototype의 초기값은 Number 프로토타입
객체 임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.1.3 Number 프로토타입 객체의 속성
Number 프로토타입 객체 :
%Number.prototype% 임.
일반
객체 임.
스스로 Number 객체이며, [[NumberData]] 내부 슬롯 값은
+0 𝔽 임.
[[Prototype]] 내부 슬롯 값은 %Object.prototype% 임.
특별히 명시하지 않으면, 아래 정의된 Number 프로토타입 객체의 메서드는 제네릭이 아니며, this 값은 반드시 Number 값 또는
[[NumberData]] 내부 슬롯이 Number 값으로 초기화된 객체여야 함.
메서드 명세 내 "this Number 값"이라는 표현은 추상 연산 ThisNumberValue 를 해당 메서드 호출의
this 값으로 호출한 결과임.
21.1.3.1 Number.prototype.constructor
Number.prototype.constructor의 초기값은 %Number% 입니다.
21.1.3.2 Number.prototype.toExponential (
fractionDigits )
이 메서드는 이 Number 값을 십진수 지수 표기법으로 표현한 문자열을 반환합니다. 지수 앞에는 한 자리, fractionDigits 이후로는
fractionDigits 개의 자릿수가 나타납니다. fractionDigits 가
undefined 인 경우, 그 Number를 고유하게 지정하기 위해 필요한 만큼의 자릿수를 포함합니다 (ToString 처럼, 단 이 경우
항상 지수 표기법으로 출력됨).
호출될 때 다음 단계를 수행합니다:
x 에 ? ThisNumberValue (this
값)을 할당한다.
f 에 ? ToIntegerOrInfinity (fractionDigits )를
할당한다.
Assert :
fractionDigits 가 undefined 이면 f 는 0이다.
x 가 유한
값 이 아니면, Number::toString (x ,
10)을 반환한다.
f < 0 또는 f > 100이면 RangeError 예외를
던진다.
x 를 ℝ (x )로 설정한다.
s 를 빈 문자열로 할당한다.
x < 0이면
s 에 "-" 를 할당한다.
x 를 -x 로 설정한다.
x = 0이면
m 에 f + 1 개의 코드 유닛 0x0030(DIGIT ZERO)로 구성된 문자열을 할당한다.
e 에 0을 할당한다.
그 외에는,
fractionDigits 가 undefined 가 아니면
10f ≤ n < 10f +
1 이면서, n × 10e -
f - x 가 0에 가장 가까운 e 와
n 을 정수 로 할당한다. 만약 두 쌍이 있다면,
n × 10e - f 가 더 큰 쌍을
선택한다.
그 외에는
ff ≥ 0, 10ff ≤ n <
10ff + 1 , 𝔽 (n ×
10e - ff )가 𝔽 (x )이며,
ff 가 가장 작은 e , n , ff 를
정수 로 할당한다. n 의 십진수
표현의 자릿수는 ff +1이고, n 은 10으로 나누어떨어지지 않으며, 가장 끝의
숫자가 고유하게 결정되지 않을 수 있음.
f 를 ff 로 설정한다.
m 에 n 의 십진수 표현(앞자리 0 없이)의 문자열을 할당한다.
f ≠ 0이면
a 를 m 의 첫 번째 코드 유닛으로 할당한다.
b 를 m 의 나머지 f 개의 코드 유닛으로 할당한다.
m 을 string-concatenation 을
이용해 a , "." , b 를 이어붙인다.
e = 0이면
c 에 "+" 를 할당한다.
d 에 "0" 를 할당한다.
그 외에는,
e > 0이면
c 에 "+" 를 할당한다.
그 외에는
Assert : e < 0.
c 에 "-" 를 할당한다.
e 를 -e 로 설정한다.
d 를 e 의 십진수 표현(앞자리 0 없이) 문자열로 할당한다.
m 을 string-concatenation 을 이용해
m , "e" , c , d 를 이어붙인다.
string-concatenation 을 이용해
s 와 m 을 이어붙인 값을 반환한다.
참고
위 규칙보다 더 정확한 변환을 제공하는 구현의 경우, 아래 대안 step 10.b.i 를
지침으로 사용하는 것이 권장됩니다:
f ≥ 0, 10f ≤ n <
10f + 1 , 𝔽 (n × 10e -
f )가 𝔽 (x )이며, f 가 가장 작은
e , n , f 를 정수 로 할당한다. n
후보가 여러 개일 경우, 𝔽 (n × 10e -
f )가 𝔽 (x )에 가장 가까운 값을 선택한다. 두 개가 있으면
짝수인 값을 고른다.
21.1.3.3 Number.prototype.toFixed ( fractionDigits )
참고 1
이 메서드는 이 Number 값을 십진수 고정 소수점 표기법으로 표현한 문자열을 반환하며, 소수점 이하 fractionDigits
개의 자릿수를 포함합니다. fractionDigits 가 undefined 이면 0으로 간주됩니다.
호출될 때 다음 단계를 수행합니다:
x 에 ? ThisNumberValue (this
값)을 할당한다.
f 에 ? ToIntegerOrInfinity (fractionDigits )를
할당한다.
Assert :
fractionDigits 가 undefined 이면 f 는 0이다.
f 가 유한
값 이 아니면 RangeError 예외를 던진다.
f < 0 또는 f > 100이면 RangeError 예외를
던진다.
x 가 유한
값 이 아니면 Number::toString (x ,
10)을 반환한다.
x 를 ℝ (x )로 설정한다.
s 를 빈 문자열로 할당한다.
x < 0이면
s 에 "-" 를 할당한다.
x 를 -x 로 설정한다.
x ≥ 1021 이면
m 에 ! ToString (𝔽 (x ))을 할당한다.
그 외에는,
n 을 n / 10f - x 가 0에 가장
가까운 정수 로 할당한다. 두 개라면 더 큰 n 을
선택한다.
n = 0이면 m 에 "0" 을, 아니면 n 의
십진수 표현(앞자리 0 없음) 문자열을 할당한다.
f ≠ 0이면
k 에 m 의 길이를 할당한다.
k ≤ f 이면
z 에 f + 1 - k 만큼 코드 유닛
0x0030(DIGIT ZERO)으로 구성된 문자열을 할당한다.
m 을 string-concatenation 을
이용해 z 와 m 을 이어붙인다.
k 를 f + 1로 설정한다.
a 에 m 의 처음 k - f 개의 코드 유닛을
할당한다.
b 에 m 의 나머지 f 개의 코드 유닛을 할당한다.
m 을 string-concatenation 을
이용해 a , "." , b 를 이어붙인다.
string-concatenation 을 이용해
s 와 m 을 이어붙인 값을 반환한다.
참고 2
toFixed의 출력은 일부 값에서 toString보다 더 정확할 수 있습니다. toString은 인접
Number 값들과 구별할 만큼만 유효 자릿수를 출력합니다. 예를 들어,
(1000000000000000128).toString()은
"1000000000000000100" 을 반환하지만,
(1000000000000000128).toFixed(0)은
"1000000000000000128" 을 반환합니다.
21.1.3.4 Number.prototype.toLocaleString ( [
reserved1 [ , reserved2 ] ] )
ECMA-402 국제화 API를 포함한 ECMAScript 구현은 ECMA-402 명세에 따라 이 메서드를 구현해야 합니다. ECMA-402 API가 포함되지 않은
구현에서는 아래 명세를 따릅니다:
이 메서드는 현재 호스트
환경 로캘의 규칙에 따라 이 Number 값을 포맷한 문자열을 반환합니다. 이 메서드는 구현
정의 이며, toString과 동일한 값을 반환해도 허용되지만 권장하지는 않습니다.
이 메서드의 선택적 매개변수 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 매개변수 위치를 다른 용도로 사용하면 안
됩니다.
21.1.3.5 Number.prototype.toPrecision ( precision )
이 메서드는 이 Number 값을 십진수 지수 표기법(지수 앞에 한 자리, precision - 1 개의 소수점 이하 자릿수) 또는
precision 개의 유효 자릿수를 가진 고정 소수점 표기법으로 표현한 문자열을 반환합니다. precision 이
undefined 이면 ToString 을 호출합니다.
호출될 때 다음 단계를 수행합니다:
x 에 ? ThisNumberValue (this
값)을 할당한다.
precision 이 undefined 이면 ! ToString (x )을 반환한다.
p 에 ? ToIntegerOrInfinity (precision )을
할당한다.
x 가 유한
값 이 아니면 Number::toString (x ,
10)을 반환한다.
p < 1 또는 p > 100이면 RangeError 예외를
던진다.
x 를 ℝ (x )로 설정한다.
s 를 빈 문자열로 할당한다.
x < 0이면
코드 유닛 0x002D(HYPHEN-MINUS)를 s 에 할당한다.
x 를 -x 로 설정한다.
x = 0이면
m 에 p 개의 코드 유닛 0x0030(DIGIT ZERO)로 구성된 문자열을 할당한다.
e 에 0을 할당한다.
그 외에는,
10p - 1 ≤ n <
10p 이고, n × 10e -
p + 1 - x 가 0에 가장 가까운 e ,
n 을 정수 로 할당한다. 두 쌍이 있다면, n ×
10e - p + 1 이 더 큰 쌍을 선택한다.
m 에 n 의 십진수 표현(앞자리 0 없음) 문자열을 할당한다.
e < -6 또는 e ≥ p 이면
Assert : e ≠ 0.
p ≠ 1이면
a 에 m 의 첫 번째 코드 유닛을 할당한다.
b 에 m 의 나머지 p - 1개 코드 유닛을
할당한다.
m 을 string-concatenation 을
이용해 a , "." , b 를
이어붙인다.
e > 0이면
코드 유닛 0x002B(PLUS SIGN)를 c 에 할당한다.
그 외에는
Assert : e
< 0.
코드 유닛 0x002D(HYPHEN-MINUS)를 c 에 할당한다.
e 를 -e 로 설정한다.
d 를 e 의 십진수 표현(앞자리 0 없음) 문자열로 할당한다.
string-concatenation 을
이용해 s , m , 코드 유닛 0x0065('e'), c ,
d 를 이어붙인 값을 반환한다.
e = p - 1이면 string-concatenation 을 이용해
s 와 m 을 이어붙인 값을 반환한다.
e ≥ 0이면
m 을 string-concatenation 을
이용해 m 의 처음 e +1개 코드 유닛, 코드 유닛 0x002E(FULL STOP), 나머지
p -(e +1)개 코드 유닛을 이어붙인다.
그 외에는,
m 을 string-concatenation 을
이용해 코드 유닛 0x0030(DIGIT ZERO), 코드 유닛 0x002E(FULL STOP), -(e + 1)
개의 코드 유닛 0x0030(DIGIT ZERO), 그리고 m 문자열을 이어붙인다.
string-concatenation 을 이용해
s 와 m 을 이어붙인 값을 반환한다.
21.1.3.6 Number.prototype.toString ( [ radix ] )
참고
선택적 radix 는 정수 Number 값이어야 하며, 2에서
36까지의 구간 내에 있어야 합니다. radix 가
undefined 이면 10 𝔽 이 사용됩니다.
이 메서드는 호출 시 다음 단계를 수행합니다:
x 에 ? ThisNumberValue (this
값)을 할당한다.
radix 가 undefined 이면 radixMV 를 10으로 할당한다.
그 외에는 radixMV 에 ? ToIntegerOrInfinity (radix )를
할당한다.
radixMV 가 2~36 구간에 포함되지 않으면 RangeError 예외를 던진다.
Number::toString (x ,
radixMV )를 반환한다.
이 메서드는 제네릭이 아니며, this 값이 Number 또는 Number
객체가 아니면 TypeError 예외를 던집니다. 따라서 다른 종류의 객체에 이 메서드를 전달해 사용할 수 없습니다.
이 메서드의 "length" 속성은 1 𝔽 입니다.
21.1.3.7 Number.prototype.valueOf ( )
? ThisNumberValue (this
값)을 반환한다.
21.1.3.7.1 ThisNumberValue ( value )
ThisNumberValue 추상 연산은 value ( ECMAScript 언어
값 ) 인수를 받아, Number를 포함하는 정상
완료 또는 throw
완료 를 반환합니다. 호출 시 다음 단계를 수행합니다:
value 가 Number 이면
value 를 반환한다.
value 가 객체 이고 value 에 [[NumberData]] 내부 슬롯이 있으면,
n 에 value .[[NumberData]] 를
할당한다.
Assert : n 이 Number 임을
보장한다.
n 을 반환한다.
TypeError 예외를 던진다.
21.1.4 Number 인스턴스의 속성
Number 인스턴스는 일반
객체 이며, Number 프로토타입
객체 로부터 속성을 상속받습니다. 또한 [[NumberData]] 내부 슬롯을 가지며,
이 슬롯 값이 이 Number 객체가 나타내는 Number 값입니다.
21.2 BigInt 객체
21.2.1 BigInt 생성자
BigInt 생성자 :
%BigInt% 임.
"BigInt" 속성의 초기값이며, 전역 객체 에 존재함.
함수로 호출될 때 타입 변환을 수행하며, 생성자 로 호출되는 것이 아님.
new 연산자와 함께 사용하거나 서브클래싱 목적으로 설계되지 않았음. 클래스 정의의 extends 값으로 사용할 수
있지만, BigInt 생성자 에 대한 super 호출은 예외를 발생시킴.
21.2.1.1 BigInt ( value )
이 함수는 호출 시 다음 단계를 수행합니다:
NewTarget이 undefined 가 아니면 TypeError 예외를 던진다.
prim 에 ? ToPrimitive (value ,
number )를 할당한다.
prim 이 Number 이면,
? NumberToBigInt (prim )을
반환한다.
그 외에는 ? ToBigInt (prim )을 반환한다.
21.2.1.1.1 NumberToBigInt ( number )
NumberToBigInt 추상 연산은 number (Number)를 인수로 받아 BigInt를 포함하는 정상
완료 또는 throw
완료 를 반환합니다. 호출 시 다음 단계를 수행합니다:
number 가 정수 Number 가 아니면,
RangeError 예외를 던진다.
ℤ (ℝ (number ))를
반환한다.
21.2.2 BigInt 생성자의 속성
BigInt 생성자 :
21.2.2.1 BigInt.asIntN ( bits , bigint )
이 함수는 호출 시 다음 단계를 수행합니다:
bits 에 ? ToIndex (bits )를 할당한다.
bigint 에 ? ToBigInt (bigint )를 할당한다.
mod 에 ℝ (bigint ) modulo
2bits 를 할당한다.
mod ≥ 2bits - 1 이면 ℤ (mod -
2bits )를 반환하고, 아니면 ℤ (mod )를 반환한다.
21.2.2.2 BigInt.asUintN ( bits , bigint )
이 함수는 호출 시 다음 단계를 수행합니다:
bits 에 ? ToIndex (bits )를 할당한다.
bigint 에 ? ToBigInt (bigint )를 할당한다.
ℤ (ℝ (bigint )
modulo
2bits )를 반환한다.
21.2.2.3 BigInt.prototype
BigInt.prototype의 초기값은 BigInt 프로토타입
객체 임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.2.3 BigInt 프로토타입 객체의 속성
BigInt 프로토타입 객체 :
메서드 명세 내 "this BigInt 값"이라는 표현은 ThisBigIntValue 를 해당 메서드 호출의
this 값으로 호출한 결과임.
21.2.3.1 BigInt.prototype.constructor
BigInt.prototype.constructor의 초기값은 %BigInt% 임.
21.2.3.2 BigInt.prototype.toLocaleString ( [
reserved1 [ , reserved2 ] ] )
ECMA-402 국제화 API를 포함한 ECMAScript 구현은 ECMA-402 명세에 따라 이 메서드를 구현해야 합니다. ECMA-402 API를 포함하지 않은
구현에서는 아래 명세를 따릅니다:
이 메서드는 현재 호스트
환경 의 로캘 규칙에 따라 이 BigInt 값을 포맷한 문자열을 반환합니다. 이 메서드는 구현
정의 이며, toString과 동일한 값을 반환해도 허용되지만 권장하지는 않습니다.
이 메서드의 선택적 매개변수 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 매개변수 위치를 다른 용도로 사용하면 안
됩니다.
21.2.3.3 BigInt.prototype.toString ( [ radix ] )
참고
선택적 radix 는 정수 Number 값이어야 하며, 2에서
36까지의 구간 내에 있어야 합니다. radix 가
undefined 이면 10 𝔽 이 사용됩니다.
이 메서드는 호출 시 다음 단계를 수행합니다:
x 에 ? ThisBigIntValue (this
값)을 할당한다.
radix 가 undefined 이면 radixMV 를 10으로 할당한다.
그 외에는 radixMV 에 ? ToIntegerOrInfinity (radix )를
할당한다.
radixMV 가 2~36 구간에 포함되지 않으면 RangeError 예외를 던진다.
BigInt::toString (x ,
radixMV )를 반환한다.
이 메서드는 제네릭이 아니며, this 값이 BigInt 또는 BigInt
객체가 아니면 TypeError 예외를 던집니다. 따라서 다른 종류의 객체에 이 메서드를 전달해 사용할 수 없습니다.
21.2.3.4 BigInt.prototype.valueOf ( )
? ThisBigIntValue (this
값)을 반환한다.
21.2.3.4.1 ThisBigIntValue ( value )
ThisBigIntValue 추상 연산은 value ( ECMAScript 언어
값 ) 인수를 받아, BigInt를 포함하는 정상
완료 또는 throw
완료 를 반환합니다. 호출 시 다음 단계를 수행합니다:
value 가 BigInt 이면
value 를 반환한다.
value 가 객체 이고 value 에 [[BigIntData]] 내부 슬롯이 있으면,
Assert : value .[[BigIntData]] 가 BigInt 임을
보장한다.
value .[[BigIntData]] 를 반환한다.
TypeError 예외를 던진다.
21.2.3.5 BigInt.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 속성의 초기값은 문자열
"BigInt" 입니다.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }임.
21.2.4 BigInt 인스턴스의 속성
BigInt 인스턴스는 일반
객체 이며, BigInt 프로토타입
객체 로부터 속성을 상속받습니다. 또한 [[BigIntData]] 내부 슬롯을 가지며,
이 슬롯 값이 이 BigInt 객체가 나타내는 BigInt 값입니다.
21.3 Math 객체
Math 객체:
%Math% 임.
"Math" 속성의 초기값이며, 글로벌 객체 에 있음.
일반
객체 임.
[[Prototype]] 내부 슬롯이 있으며, 값은 %Object.prototype% 임.
함수
객체 가 아님.
[[Construct]] 내부 메서드가 없으며, new 연산자와 함께 생성자 로 사용할 수 없음.
[[Call]] 내부 메서드가 없으며, 함수로 호출할 수 없음.
참고
이 명세에서 “x의
Number 값 ”라는 문구는 6.1.6.1 에 정의된 기술적
의미를 가짐.
21.3.1 Math 객체의 값 속성
21.3.1.1 Math.E
e의 Number
값 , 자연로그의 밑, 약 2.7182818284590452354.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.3.1.2 Math.LN10
10의 자연로그의
Number 값 , 약 2.302585092994046.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.3.1.3 Math.LN2
2의 자연로그의 Number
값 , 약 0.6931471805599453.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.3.1.4 Math.LOG10E
e의 상용로그의 Number
값 , 자연로그의 밑의 상용로그; 약 0.4342944819032518.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
참고
Math.LOG10E의 값은 Math.LN10의 값의 역수에 가까움.
21.3.1.5 Math.LOG2E
e의 밑이 2인 로그의
Number 값 , 자연로그의 밑의 밑이 2인 로그; 약 1.4426950408889634.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
참고
Math.LOG2E의 값은 Math.LN2의 값의 역수에 가까움.
21.3.1.6 Math.PI
π의 Number
값 , 원의 둘레와 지름의 비율, 약 3.1415926535897932.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.3.1.7 Math.SQRT1_2
½의 제곱근의 Number
값 , 약 0.7071067811865476.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
참고
Math.SQRT1_2의 값은 Math.SQRT2의 값의 역수에 가까움.
21.3.1.8 Math.SQRT2
2의 제곱근의 Number
값 , 약 1.4142135623730951.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.3.1.9 Math [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 속성의 초기값은 문자열
"Math" 임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }임.
21.3.2 Math 객체의 함수 속성
참고
acos, acosh, asin,
asinh, atan, atanh, atan2,
cbrt, cos, cosh, exp,
expm1, hypot, log, log1p,
log2, log10, pow, random,
sin, sinh, tan, tanh 함수의 동작은 여기서
정확하게 명세되어 있지 않으며, 경계값에 대해 특정 결과만 요구됩니다. 그 외의 인자 값에 대해서는 일반적인 수학 함수의 근삿값을 계산하도록 되어 있으나,
근사 알고리즘 선택에는 여지가 있습니다. 일반적인 의도는 구현자가 해당 하드웨어 플랫폼의 C 프로그래머가 사용할 수 있는 수학 라이브러리를
ECMAScript에 사용할 수 있도록 하는 것입니다.
알고리즘 선택은 구현에 맡기지만, IEEE 754-2019 산술에 대한 근사 알고리즘으로 Sun
Microsystems의 자유 배포 수학 라이브러리 fdlibm (http://www.netlib.org/fdlibm ) 사용을 권장합니다(명세상
필수는 아님).
21.3.2.1 Math.abs ( x )
이 함수는 x 의 절댓값을 반환합니다; 결과는 x 와 크기는 같으나 부호는 양수입니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 이면 NaN 을 반환한다.
n 이 -0 𝔽 이면
+0 𝔽 을 반환한다.
n 이 -∞ 𝔽 이면
+∞ 𝔽 을 반환한다.
n < -0 𝔽 이면 -n 을 반환한다.
n 을 반환한다.
21.3.2.2 Math.acos ( x )
이 함수는 x 의 아크코사인(역삼각함수 cos-1 )을 반환합니다. 결과는 라디안 단위이며 +0𝔽 에서 𝔽 (π)까지의 구간 에 있습니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 이거나 n >
1 𝔽 이거나 n <
-1 𝔽 이면 NaN 을 반환한다.
n 이 1 𝔽 이면
+0 𝔽 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
아크코사인임.
21.3.2.3 Math.acosh ( x )
이 함수는 x 의 역쌍곡코사인(아크코사인 하이퍼볼릭)을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 또는 +∞ 𝔽 이면
n 을 반환한다.
n 이 1 𝔽 이면
+0 𝔽 을 반환한다.
n < 1 𝔽 이면 NaN 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
역쌍곡코사인임.
21.3.2.4 Math.asin ( x )
이 함수는 x 의 아크사인(역삼각함수 sin-1 )을 반환합니다. 결과는 라디안 단위이며 -π/2에서 π/2까지의
구간 에 있습니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 중 하나이면 n 을 반환한다.
n > 1 𝔽 또는 n <
-1 𝔽 이면 NaN 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
아크사인임.
21.3.2.5 Math.asinh ( x )
이 함수는 x 의 역쌍곡사인(아크사인 하이퍼볼릭)을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 유한
값 이 아니거나 n 이 +0 𝔽 또는
-0 𝔽 이면 n 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
역쌍곡사인임.
21.3.2.6 Math.atan ( x )
이 함수는 x 의 아크탄젠트(역삼각함수 tan-1 )를 반환합니다. 결과는 라디안 단위이며 -π/2에서 π/2까지의
구간 에 있습니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 중 하나이면 n 을 반환한다.
n 이 +∞ 𝔽 이면 구현 근삿값 Number 값으로 π/2를
반환한다.
n 이 -∞ 𝔽 이면 구현 근삿값 Number 값으로 -π/2를
반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
아크탄젠트임.
21.3.2.7 Math.atanh ( x )
이 함수는 x 의 역쌍곡탄젠트(아크탄젠트 하이퍼볼릭)를 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 중 하나이면 n 을 반환한다.
n > 1 𝔽 또는 n <
-1 𝔽 이면 NaN 을 반환한다.
n 이 1 𝔽 이면
+∞ 𝔽 을 반환한다.
n 이 -1 𝔽 이면
-∞ 𝔽 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
역쌍곡탄젠트임.
21.3.2.8 Math.atan2 ( y , x )
이 함수는 인자 y 와 x 의 몫 y /
x 의 아크탄젠트(역삼각함수 tan-1 )를 반환합니다. y 와
x 의 부호로 결과의 사분면이 결정됩니다. 두 인자에서 y 가 먼저, x 가 두 번째임은 의도적이고
전통적입니다. 결과는 라디안 단위이며 -π에서 +π까지의 구간 에 있습니다.
호출 시 다음 단계를 수행합니다:
ny 에 ? ToNumber (y )를 할당한다.
nx 에 ? ToNumber (x )를 할당한다.
ny 가 NaN 이거나 nx 가 NaN 이면
NaN 을 반환한다.
ny 가 +∞ 𝔽 이면,
nx 가 +∞ 𝔽 이면 구현 근삿값 Number 값으로
π/4를 반환한다.
nx 가 -∞ 𝔽 이면 구현 근삿값 Number 값으로
3π/4를 반환한다.
그 외에는 구현 근삿값 Number 값으로
π/2를 반환한다.
ny 가 -∞ 𝔽 이면,
nx 가 +∞ 𝔽 이면 구현 근삿값 Number 값으로
-π/4를 반환한다.
nx 가 -∞ 𝔽 이면 구현 근삿값 Number 값으로
-3π/4를 반환한다.
그 외에는 구현 근삿값 Number 값으로
-π/2를 반환한다.
ny 가 +0 𝔽 이면,
nx > +0 𝔽 또는 nx 가
+0 𝔽 이면 +0 𝔽 을
반환한다.
그 외에는 구현 근삿값 Number 값으로
π를 반환한다.
ny 가 -0 𝔽 이면,
nx > +0 𝔽 또는 nx 가
+0 𝔽 이면 -0 𝔽 을
반환한다.
그 외에는 구현 근삿값 Number 값으로
-π를 반환한다.
Assert :
ny 는 유한
값 이며 +0 𝔽 또는
-0 𝔽 이 아님.
ny > +0 𝔽 이면,
nx 가 +∞ 𝔽 이면
+0 𝔽 을 반환한다.
nx 가 -∞ 𝔽 이면 구현 근삿값 Number 값으로
π를 반환한다.
nx 가 +0 𝔽 또는
-0 𝔽 이면 구현 근삿값 Number 값으로
π/2를 반환한다.
ny < -0 𝔽 이면,
nx 가 +∞ 𝔽 이면
-0 𝔽 을 반환한다.
nx 가 -∞ 𝔽 이면 구현 근삿값 Number 값으로
-π를 반환한다.
nx 가 +0 𝔽 또는
-0 𝔽 이면 구현 근삿값 Number 값으로
-π/2를 반환한다.
Assert :
nx 는 유한
값 이며 +0 𝔽 또는
-0 𝔽 이 아님.
r 에 abs (ℝ (ny ) / ℝ (nx ))의 아크탄젠트를 할당한다.
nx < -0 𝔽 이면,
ny > +0 𝔽 이면 r 을 π -
r 로 설정한다.
그 외에는 r 을 -π + r 로 설정한다.
그 외에는,
ny < -0 𝔽 이면 r 을
-r 로 설정한다.
구현 근삿값 Number 값으로
r 을 반환한다.
21.3.2.9 Math.cbrt ( x )
이 함수는 x 의 세제곱근을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 유한
값 이 아니거나 n 이 +0 𝔽 또는
-0 𝔽 이면, n 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
세제곱근임.
21.3.2.10 Math.ceil ( x )
이 함수는 x 보다 작지 않은 가장 작은(음의 무한대에 가장 가까운) 정수 Number 값을 반환합니다.
x 가 이미 정수 Number 이면, 결과는 x 입니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 유한
값 이 아니거나 n 이 +0 𝔽 또는
-0 𝔽 이면, n 을 반환한다.
n < -0 𝔽 이고 n >
-1 𝔽 이면, -0 𝔽 을 반환한다.
n 이 정수 Number 이면, n 을 반환한다.
n 보다 작지 않은 가장 작은(음의 무한대에 가장 가까운) 정수 Number 값을 반환한다.
참고
Math.ceil(x)의 값은 -Math.floor(-x)의 값과 같습니다.
21.3.2.11 Math.clz32 ( x )
이 함수는 호출 시 다음 단계를 수행합니다:
n 에 ? ToUint32 (x )를 할당한다.
p 에 n 의 부호 없는 32비트 이진 표현에서 앞에 오는 0 비트 개수를 할당한다.
𝔽 (p )를
반환한다.
참고
n 이 +0 𝔽 또는
-0 𝔽 이면, 이 메서드는 32 𝔽 를
반환합니다. n 의 32비트 이진 인코딩의 최상위 비트가 1이면, 이 메서드는
+0 𝔽 을 반환합니다.
21.3.2.12 Math.cos ( x )
이 함수는 x 의 코사인 값을 반환합니다. 인자는 라디안 단위입니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 유한
값 이 아니면, NaN 을 반환한다.
n 이 +0 𝔽 또는
-0 𝔽 이면, 1 𝔽 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
코사인임.
21.3.2.13 Math.cosh ( x )
이 함수는 x 의 쌍곡코사인 값을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 이면, NaN 을 반환한다.
n 이 +∞ 𝔽 또는
-∞ 𝔽 이면, +∞ 𝔽 을 반환한다.
n 이 +0 𝔽 또는
-0 𝔽 이면, 1 𝔽 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
쌍곡코사인임.
참고
Math.cosh(x)의 값은 (Math.exp(x) + Math.exp(-x)) / 2의 값과 같습니다.
21.3.2.14 Math.exp ( x )
이 함수는 x 의 지수 함수 값을 반환합니다 (e 를 x 제곱한 값, e 는 자연로그의 밑).
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 또는 +∞ 𝔽 이면,
n 을 반환한다.
n 이 +0 𝔽 또는
-0 𝔽 이면, 1 𝔽 을 반환한다.
n 이 -∞ 𝔽 이면,
+0 𝔽 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의 지수
함수임.
21.3.2.15 Math.expm1 ( x )
이 함수는 x 의 지수 함숫값에서 1을 뺀 값을 반환합니다 (e 를 x 제곱한 값에서 1을 뺌,
e 는 자연로그의 밑). x 가 0에 가까울 때도 정확하게 계산되도록 설계되어 있습니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 , +∞ 𝔽 중 하나이면,
n 을 반환한다.
n 이 -∞ 𝔽 이면,
-1 𝔽 을 반환한다.
exp 에 ℝ (n )의 지수 함수 값을 할당한다.
구현 근삿값 Number 값을 반환하는데,
exp - 1임.
21.3.2.16 Math.floor ( x )
이 함수는 x 보다 크지 않은 가장 큰(양의 무한대에 가장 가까운) 정수 Number 값을 반환합니다.
x 가 이미 정수 Number 이면, 결과는 x 입니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 유한
값 이 아니거나 n 이 +0 𝔽 또는
-0 𝔽 이면, n 을 반환한다.
n < 1 𝔽 이고 n >
+0 𝔽 이면, +0 𝔽 을 반환한다.
n 이 정수 Number 이면, n 을 반환한다.
n 보다 크지 않은 가장 큰(양의 무한대에 가장 가까운) 정수 Number 값을 반환한다.
참고
Math.floor(x)의 값은 -Math.ceil(-x)의 값과 같습니다.
21.3.2.17 Math.fround ( x )
이 함수는 호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 이면, NaN 을 반환한다.
n 이 +0 𝔽 ,
-0 𝔽 , +∞ 𝔽 ,
-∞ 𝔽 중 하나이면, n 을 반환한다.
n32 에 n 을 IEEE
754-2019 binary32 형식으로 roundTiesToEven 모드로 변환한 결과를 할당한다.
n64 에 n32 를 IEEE
754-2019 binary64 형식으로 변환한 결과를 할당한다.
n64 에 해당하는 ECMAScript Number 값을 반환한다.
21.3.2.18 Math.f16round ( x )
이 함수는 호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 이면, NaN 을 반환한다.
n 이 +0 𝔽 ,
-0 𝔽 , +∞ 𝔽 ,
-∞ 𝔽 중 하나이면, n 을 반환한다.
n16 에 n 을 IEEE
754-2019 binary16 형식으로 roundTiesToEven 모드로 변환한 결과를 할당한다.
n64 에 n16 을 IEEE
754-2019 binary64 형식으로 변환한 결과를 할당한다.
n64 에 해당하는 ECMAScript Number 값을 반환한다.
참고
이 연산은 binary32로 캐스팅한 뒤 binary16으로 캐스팅하는 것과 동일하지 않습니다. 이중 반올림(double-rounding)이 발생할 수
있기 때문입니다: 예를 들어 k =
1.00048828125000022204 𝔽 의 경우,
Math.f16round(k )는 1.0009765625 𝔽 이지만
Math.f16round(Math.fround(k ))는 1 𝔽 입니다.
모든 플랫폼이 binary64에서 binary16으로의 캐스팅을 기본 지원하지는 않습니다. 이를 위한 다양한 라이브러리가 있으며, MIT 라이선스의 half 라이브러리 등이 있습니다. 또는 binary64를
roundTiesToEven으로 binary32로 먼저 캐스팅한 다음, 그 결과가 잘못된 이중 반올림을 유발할 수 있는지 확인하는 방법도 있습니다.
문제가 될 수 있는 경우는 mantissa를 조정하여 roundTiesToOdd로 캐스팅한 결과와 같도록 만든 뒤, 다시
roundTiesToEven으로 binary16으로 캐스팅하면 올바른 값을 얻을 수 있습니다.
21.3.2.19 Math.hypot ( ...args )
0개 이상의 인자를 받아, 인자들의 제곱의 합의 제곱근을 반환합니다.
호출 시 다음 단계를 수행합니다:
coerced 에 새로운 빈 List 를 할당한다.
args 의 각 요소 arg 에 대해,
n 에 ? ToNumber (arg )를 할당한다.
n 을 coerced 에 추가한다.
coerced 의 각 요소 number 에 대해,
number 가 +∞ 𝔽 또는
-∞ 𝔽 이면, +∞ 𝔽 을
반환한다.
onlyZero 에 true 를 할당한다.
coerced 의 각 요소 number 에 대해,
number 가 NaN 이면, NaN 을 반환한다.
number 가 +0 𝔽 또는
-0 𝔽 이 아니면, onlyZero 를
false 로 설정한다.
onlyZero 가 true 이면, +0 𝔽 을
반환한다.
구현 근삿값 Number 값을 반환하는데,
coerced 의 각 요소의 수학적 값 의 제곱의 합의 제곱근임.
이 함수의 "length" 속성은 2 𝔽 입니다.
참고
구현체는 2개 이상의 인자로 호출될 때 오버플로우와 언더플로우로 인한 정밀도 손실을 주의해야 합니다.
21.3.2.20 Math.imul ( x , y )
이 함수는 호출 시 다음 단계를 수행합니다:
a 에 ℝ (?
ToUint32 (x ))를 할당한다.
b 에 ℝ (?
ToUint32 (y ))를 할당한다.
product 에 (a × b ) modulo 232 를
할당한다.
product ≥ 231 이면, 𝔽 (product - 232 )를 반환하고, 아니면
𝔽 (product )를 반환한다.
21.3.2.21 Math.log ( x )
이 함수는 x 의 자연로그 값을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 또는 +∞ 𝔽 이면,
n 을 반환한다.
n 이 1 𝔽 이면,
+0 𝔽 을 반환한다.
n 이 +0 𝔽 또는
-0 𝔽 이면, -∞ 𝔽 을 반환한다.
n < -0 𝔽 이면, NaN 을
반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
자연로그임.
21.3.2.22 Math.log1p ( x )
이 함수는 1 + x 의 자연로그 값을 반환합니다. x 가 0에 가까울 때도 정확하게 계산되도록 설계되어 있습니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 , +∞ 𝔽 중 하나이면,
n 을 반환한다.
n 이 -1 𝔽 이면,
-∞ 𝔽 을 반환한다.
n < -1 𝔽 이면, NaN 을
반환한다.
구현 근삿값 Number 값을 반환하는데, 1
+ ℝ (n )의
자연로그임.
21.3.2.23 Math.log10 ( x )
이 함수는 x 의 밑이 10인 로그 값을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 또는 +∞ 𝔽 이면,
n 을 반환한다.
n 이 1 𝔽 이면,
+0 𝔽 을 반환한다.
n 이 +0 𝔽 또는
-0 𝔽 이면, -∞ 𝔽 을 반환한다.
n < -0 𝔽 이면, NaN 을
반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의 밑이
10인 로그임.
21.3.2.24 Math.log2 ( x )
이 함수는 x 의 밑이 2인 로그 값을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 또는 +∞ 𝔽 이면,
n 을 반환한다.
n 이 1 𝔽 이면,
+0 𝔽 을 반환한다.
n 이 +0 𝔽 또는
-0 𝔽 이면, -∞ 𝔽 을 반환한다.
n < -0 𝔽 이면, NaN 을
반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의 밑이
2인 로그임.
21.3.2.25 Math.max ( ...args )
0개 이상의 인자를 받아, 각 인자에 ToNumber 를 호출하고 그 결과 값 중 가장 큰 값을 반환합니다.
호출 시 다음 단계를 수행합니다:
coerced 에 새로운 빈 List 를 할당한다.
args 의 각 요소 arg 에 대해,
n 에 ? ToNumber (arg )를 할당한다.
n 을 coerced 에 추가한다.
highest 에 -∞ 𝔽 를 할당한다.
coerced 의 각 요소 number 에 대해,
number 가 NaN 이면, NaN 을 반환한다.
number 가 +0 𝔽 이고 highest 가
-0 𝔽 이면, highest 를
+0 𝔽 로 설정한다.
number > highest 이면, highest 를
number 로 설정한다.
highest 를 반환한다.
참고
가장 큰 값을 결정하는 값의 비교는 IsLessThan 알고리즘을 사용하지만
+0 𝔽 은 -0 𝔽 보다 더 큰 것으로
간주합니다.
이 함수의 "length" 속성은 2 𝔽 입니다.
21.3.2.26 Math.min ( ...args )
0개 이상의 인자를 받아, 각 인자에 ToNumber 를 호출하고 그 결과 값 중 가장 작은 값을 반환합니다.
호출 시 다음 단계를 수행합니다:
coerced 에 새로운 빈 List 를 할당한다.
args 의 각 요소 arg 에 대해,
n 에 ? ToNumber (arg )를 할당한다.
n 을 coerced 에 추가한다.
lowest 에 +∞ 𝔽 를 할당한다.
coerced 의 각 요소 number 에 대해,
number 가 NaN 이면, NaN 을 반환한다.
number 가 -0 𝔽 이고 lowest 가
+0 𝔽 이면, lowest 를
-0 𝔽 로 설정한다.
number < lowest 이면, lowest 를
number 로 설정한다.
lowest 를 반환한다.
참고
가장 큰 값을 결정하는 비교는 IsLessThan 알고리즘을 사용하지만,
+0 𝔽 은 -0 𝔽 보다 더 큰 것으로
간주합니다.
이 함수의 "length" 속성은 2 𝔽 입니다.
21.3.2.27 Math.pow ( base , exponent )
이 함수는 호출 시 다음 단계를 수행합니다:
base 에 ? ToNumber (base )를 할당한다.
exponent 에 ? ToNumber (exponent )를 할당한다.
Number::exponentiate (base ,
exponent )를 반환한다.
21.3.2.28 Math.random ( )
이 함수는 양수 부호를 가지며, +0 𝔽 이상 1 𝔽 미만인
Number 값을 반환합니다. 이 값은 해당 구간에서 임의로 또는 의사 임의적으로 대략적으로 균일한 분포로 선택되며, 구현
정의 알고리즘이나 전략을 사용합니다.
서로 다른 realm 에 대해 생성된 각
Math.random 함수는 연속 호출 시 서로 다른 값의 시퀀스를 생성해야 합니다.
21.3.2.29 Math.round ( x )
이 함수는 x 에 가장 가까운 정수 Number 값을 반환합니다. 두 정수 Number 가 x 에 동일하게
가까우면, 결과는 +∞에 더 가까운 Number 값입니다. x 가 이미 정수라면 결과는 x 입니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 유한
값 이 아니거나 n 이 정수 Number 이면,
n 을 반환한다.
n < 0.5 𝔽 이고 n >
+0 𝔽 이면, +0 𝔽 을 반환한다.
n < -0 𝔽 이고 n ≥
-0.5 𝔽 이면, -0 𝔽 을 반환한다.
n 에 가장 가까운 정수 Number 를 반환하는데, 동점일 경우 +∞에 더 가까운 값을
반환한다.
참고 1
Math.round(3.5)는 4를 반환하지만 Math.round(-3.5)는 -3을 반환합니다.
참고 2
Math.round(x)의 값은 항상 Math.floor(x + 0.5)의 값과 같지 않습니다.
x가 -0 𝔽 이거나 x가
-0 𝔽 보다 작고 -0.5 𝔽 이상이면,
Math.round(x)는 -0 𝔽 을 반환하지만
Math.floor(x + 0.5)는 +0 𝔽 을 반환합니다.
Math.round(x)는 Math.floor(x + 0.5)와 내부적으로 x + 0.5를 계산할 때의
반올림 차이로 인해 값이 다를 수도 있습니다.
21.3.2.30 Math.sign ( x )
이 함수는 x 의 부호를 반환하며, x 가 양수, 음수 또는 0인지 나타냅니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 중 하나이면, n 을 반환한다.
n < -0 𝔽 이면,
-1 𝔽 을 반환한다.
1 𝔽 을 반환한다.
21.3.2.31 Math.sin ( x )
이 함수는 x 의 사인 값을 반환합니다. 인자는 라디안 단위입니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 중 하나이면, n 을 반환한다.
n 이 +∞ 𝔽 또는
-∞ 𝔽 이면, NaN 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의 사인임.
21.3.2.32 Math.sinh ( x )
이 함수는 x 의 쌍곡사인 값을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 유한
값 이 아니거나 n 이 +0 𝔽 또는
-0 𝔽 이면, n 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
쌍곡사인임.
참고
Math.sinh(x)의 값은 (Math.exp(x) - Math.exp(-x)) / 2의 값과 같습니다.
21.3.2.33 Math.sqrt ( x )
이 함수는 x 의 제곱근 값을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 , +∞ 𝔽 중 하나이면,
n 을 반환한다.
n < -0 𝔽 이면, NaN 을
반환한다.
𝔽 (n 의
제곱근, ℝ (n ))를 반환한다.
21.3.2.34 Math.tan ( x )
이 함수는 x 의 탄젠트 값을 반환합니다. 인자는 라디안 단위입니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 중 하나이면, n 을 반환한다.
n 이 +∞ 𝔽 또는
-∞ 𝔽 이면, NaN 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
탄젠트임.
21.3.2.35 Math.tanh ( x )
이 함수는 x 의 쌍곡탄젠트 값을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 중 하나이면, n 을 반환한다.
n 이 +∞ 𝔽 이면,
1 𝔽 을 반환한다.
n 이 -∞ 𝔽 이면,
-1 𝔽 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
쌍곡탄젠트임.
참고
Math.tanh(x)의 값은
(Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x))의 값과 같습니다.
21.3.2.36 Math.trunc ( x )
이 함수는 숫자 x 의 소수 부분을 제거하고 정수 부분만 반환합니다. x 가 이미 정수라면 결과는 x 입니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 유한
값 이 아니거나 n 이 +0 𝔽 또는
-0 𝔽 이면, n 을 반환한다.
n < 1 𝔽 이고 n >
+0 𝔽 이면, +0 𝔽 을 반환한다.
n < -0 𝔽 이고 n >
-1 𝔽 이면, -0 𝔽 을 반환한다.
n 에 가장 가까운 정수 Number 를 +0𝔽 방향으로 반환한다.
21.4 Date 객체
21.4.1 Date 객체 개요와 추상 연산 정의
다음 추상 연산 들은 시간 값 에 대해 동작합니다(21.4.1.1 에서 정의됨). 이 함수들에 전달되는 인수 중
하나라도 NaN 이면, 결과도 NaN 이 됨을 유의하세요.
21.4.1.1 시간 값과 시간 범위
ECMAScript의 시간 측정은 POSIX의 시간 측정과 유사하며, 역 그레고리력(proleptic Gregorian calendar), 1970년 1월 1일
자정(UTC)이라는 기점(epoch) , 그리고 모든 날이 정확히 86,400초(각각 1000밀리초)로
구성된다는 정의를 공유합니다.
ECMAScript 시간 값 은 Number 타입이며, 밀리초
단위로 시간을 나타내는 유한
정수
Number 이거나, 특정 순간을 나타내지 않음은 NaN 으로 나타냄. 24 × 60 × 60
× 1000 = 86,400,000의 배수(즉, 86,400,000 × d 형태, 정수 d 에 대해)는 기점 이후 d 일째 UTC의
시작 순간을 나타냅니다(음수 d 는 기점 이전). 그 외의 유한 시간 값 t 는 가장 가까운 앞선 배수 s 를 기준으로,
그 날의 시작 순간에서 (t - s ) 밀리초 후를 나타냅니다.
시간 값은 UTC 윤초(leap second)를 고려하지 않습니다—양의 윤초 구간의 순간을 나타내는 시간 값은 없고, 음의 윤초로 인해 제거된 순간을 나타내는 값은
존재합니다. 하지만 시간 값의 정의는 윤초 경계에서만 불연속이 있으며, 그 외에는 UTC와 일치합니다.
Number 타입은 -9,007,199,254,740,992에서 9,007,199,254,740,992(21.1.2.8 , 21.1.2.6 )까지의 모든 정수 를 정확히 나타낼 수 있습니다.
하지만 시간 값의 범위는 -8,640,000,000,000,000에서 8,640,000,000,000,000 밀리초까지로, 1970년 1월 1일 자정 기준으로 정확히
-100,000,000일부터 +100,000,000일까지의 범위를 지원합니다.
1970년 1월 1일 자정(UTC) 순간은 +0 𝔽 시간 값으로 나타냅니다.
참고
역 그레고리력에서 윤년은 4로 나누어지고, 400으로 나누어지거나 100으로 나누어지지 않는 해입니다.
400년 주기에는 윤년이 97번 있습니다. 평균적으로 1년에 365.2425일, 즉 31,556,952,000밀리초가 됩니다. Number 타입이 밀리초
단위로 정확히 나타낼 수 있는 최대 범위는 1970년 기준 대략 -285,426년에서 +285,426년입니다. 이 섹션에서 규정한 시간 값의 범위는 약
-273,790년에서 +273,790년입니다.
21.4.1.2 시간 관련 상수
이 상수들은 이후 섹션의 알고리즘에서 참조됩니다.
HoursPerDay = 24
MinutesPerHour = 60
SecondsPerMinute = 60
msPerSecond = 1000 𝔽
21.4.1.3 Day ( t )
Day 추상 연산은 t (유한 시간 값 )을 인수로 받아
정수
Number 를 반환합니다. t 가 속한 날의 day number를 반환합니다. 호출 시 다음 단계를
수행합니다:
𝔽 (floor (ℝ (t / msPerDay )))를 반환한다.
21.4.1.4 TimeWithinDay ( t )
TimeWithinDay 추상 연산은 t (유한 시간 값 )을 인수로 받아
정수
Number 를 반환하며, +0𝔽 (포함)에서 msPerDay (제외)까지의 구간 내에
있습니다. t 가 속한 날의 시작 순간부터 경과한 밀리초를 반환합니다. 호출 시 다음 단계를 수행합니다:
𝔽 (ℝ (t ) modulo
ℝ (msPerDay )))를 반환한다.
21.4.1.5 DaysInYear ( y )
DaysInYear 추상 연산은 y (정수 Number )를 인수로 받아
365 𝔽 또는 366 𝔽 을 반환합니다.
y 년의 날 수를 반환하며, 윤년은 366일, 그 외는 365일입니다. 호출 시 다음 단계를 수행합니다:
ry 에 ℝ (y )를 할당한다.
(ry modulo 400) = 0이면,
366 𝔽 을 반환한다.
(ry modulo 100) = 0이면,
365 𝔽 을 반환한다.
(ry modulo 4) = 0이면,
366 𝔽 을 반환한다.
365 𝔽 을 반환한다.
21.4.1.6 DayFromYear ( y )
DayFromYear 추상 연산은 y (정수 Number )를 인수로 받아 정수
Number 를 반환합니다. y 년의 첫날의 day number를 반환합니다. 호출 시 다음 단계를
수행합니다:
ry 에 ℝ (y )를 할당한다.
NOTE: 아래 단계에서
numYears1 , numYears4 , numYears100 ,
numYears400 은 기점 부터 y 년 시작까지 1, 4, 100, 400으로 나누어
떨어지는 해의 수를 나타냅니다. y 가 기점 이전이라면 음수입니다.
numYears1 에 (ry - 1970)를 할당한다.
numYears4 에 floor ((ry - 1969) / 4)를 할당한다.
numYears100 에 floor ((ry - 1901) / 100)를 할당한다.
numYears400 에 floor ((ry - 1601) / 400)를 할당한다.
𝔽 (365 ×
numYears1 + numYears4 - numYears100 +
numYears400 )를 반환한다.
21.4.1.7 TimeFromYear ( y )
TimeFromYear 추상 연산은 y (정수 Number )를 인수로 받아 시간 값 을 반환합니다. y 년 시작
순간의 시간 값 을 반환합니다. 호출 시 다음 단계를
수행합니다:
msPerDay × DayFromYear (y )를 반환한다.
21.4.1.8 YearFromTime ( t )
YearFromTime 추상 연산은 t (유한 시간 값 )을 인수로 받아
정수
Number 를 반환합니다. t 가 속한 해를 반환합니다. 호출 시 다음 단계를 수행합니다:
+∞에 가장 가까운 정수 Number y 중 TimeFromYear (y ) ≤
t 인 값 중 가장 큰 값을 반환한다.
21.4.1.9 DayWithinYear ( t )
DayWithinYear 추상 연산은 t (유한 시간 값 )을 인수로 받아
정수
Number 를 반환하며, +0𝔽 에서 365𝔽 까지의 구간
내에 있습니다. 호출 시 다음 단계를 수행합니다:
Day (t ) - DayFromYear (YearFromTime (t ))를 반환한다.
21.4.1.10 InLeapYear ( t )
InLeapYear 추상 연산은 t (유한 시간 값 )을 인수로 받아
+0 𝔽 또는 1 𝔽 을 반환합니다.
t 가 윤년 내에 있으면 1 𝔽 , 아니면
+0 𝔽 을 반환합니다. 호출 시 다음 단계를 수행합니다:
DaysInYear (YearFromTime (t ))이
366 𝔽 이면, 1 𝔽 을 반환하고, 아니면
+0 𝔽 을 반환한다.
21.4.1.11 MonthFromTime ( t )
MonthFromTime 추상 연산은 t ( 유한 시간 값 )을 인수로 받고,
정수
Number 를 반환하는데,
포함
구간 +0 𝔽 부터
11 𝔽 까지이다.
t 가 속한 월을 나타내는 Number를 반환한다.
+0 𝔽 은 1월, 1 𝔽 은 2월,
2 𝔽 은 3월,
3 𝔽 은 4월, 4 𝔽 은 5월,
5 𝔽 은 6월,
6 𝔽 은 7월, 7 𝔽 은 8월,
8 𝔽 은 9월,
9 𝔽 은 10월, 10 𝔽 은 11월,
11 𝔽 은 12월을 의미한다.
MonthFromTime(+0 𝔽 ) =
+0 𝔽 이며, 이는 1970년 1월 1일 목요일을 의미한다.
다음 단계로 동작한다:
inLeapYear 에 InLeapYear (t )를 할당한다.
dayWithinYear 에 DayWithinYear (t )를 할당한다.
dayWithinYear < 31 𝔽 이면
+0 𝔽 을 반환한다.
dayWithinYear < 59 𝔽 +
inLeapYear 이면 1 𝔽 을 반환한다.
dayWithinYear < 90 𝔽 +
inLeapYear 이면 2 𝔽 을 반환한다.
dayWithinYear < 120 𝔽 +
inLeapYear 이면 3 𝔽 을 반환한다.
dayWithinYear < 151 𝔽 +
inLeapYear 이면 4 𝔽 을 반환한다.
dayWithinYear < 181 𝔽 +
inLeapYear 이면 5 𝔽 을 반환한다.
dayWithinYear < 212 𝔽 +
inLeapYear 이면 6 𝔽 을 반환한다.
dayWithinYear < 243 𝔽 +
inLeapYear 이면 7 𝔽 을 반환한다.
dayWithinYear < 273 𝔽 +
inLeapYear 이면 8 𝔽 을 반환한다.
dayWithinYear < 304 𝔽 +
inLeapYear 이면 9 𝔽 을 반환한다.
dayWithinYear < 334 𝔽 +
inLeapYear 이면 10 𝔽 을 반환한다.
Assert :
dayWithinYear < 365 𝔽 +
inLeapYear 이다.
11 𝔽 을 반환한다.
21.4.1.12 DateFromTime ( t )
DateFromTime 추상 연산은 t ( 유한 시간 값 )을 인수로 받고,
정수
Number 를 반환하는데,
포함
구간 1 𝔽 부터
31 𝔽 까지이다.
t 가 속한 월의 날짜(일)을 반환한다.
다음 단계로 동작한다:
inLeapYear 에 InLeapYear (t )를 할당한다.
dayWithinYear 에 DayWithinYear (t )를 할당한다.
month 에 MonthFromTime (t )를 할당한다.
month 가 +0 𝔽 이면 dayWithinYear +
1 𝔽 을 반환한다.
month 가 1 𝔽 이면 dayWithinYear -
30 𝔽 을 반환한다.
month 가 2 𝔽 이면 dayWithinYear -
58 𝔽 - inLeapYear 을 반환한다.
month 가 3 𝔽 이면 dayWithinYear -
89 𝔽 - inLeapYear 을 반환한다.
month 가 4 𝔽 이면 dayWithinYear -
119 𝔽 - inLeapYear 을 반환한다.
month 가 5 𝔽 이면 dayWithinYear -
150 𝔽 - inLeapYear 을 반환한다.
month 가 6 𝔽 이면 dayWithinYear -
180 𝔽 - inLeapYear 을 반환한다.
month 가 7 𝔽 이면 dayWithinYear -
211 𝔽 - inLeapYear 을 반환한다.
month 가 8 𝔽 이면 dayWithinYear -
242 𝔽 - inLeapYear 을 반환한다.
month 가 9 𝔽 이면 dayWithinYear -
272 𝔽 - inLeapYear 을 반환한다.
month 가 10 𝔽 이면 dayWithinYear -
303 𝔽 - inLeapYear 을 반환한다.
Assert :
month 는 11 𝔽 임.
dayWithinYear - 333 𝔽 -
inLeapYear 을 반환한다.
21.4.1.13 WeekDay ( t )
WeekDay 추상 연산은 t ( 유한 시간 값 )을 인수로 받고,
정수
Number 를 반환하는데,
포함
구간 +0 𝔽 부터
6 𝔽 까지이다.
t 가 속한 요일을 나타내는 Number를 반환한다.
+0 𝔽 은 일요일, 1 𝔽 은 월요일,
2 𝔽 은 화요일,
3 𝔽 은 수요일, 4 𝔽 은 목요일,
5 𝔽 은 금요일,
6 𝔽 은 토요일을 의미한다.
WeekDay(+0 𝔽 ) =
4 𝔽 이며, 이는 1970년 1월 1일 목요일을 의미한다.
다음 단계로 동작한다:
𝔽 (ℝ (Day (t ) +
4 𝔽 ) modulo 7 )을 반환한다.
21.4.1.14 HourFromTime ( t )
HourFromTime 추상 연산은 t ( 유한 시간 값 )을 인수로 받고,
정수
Number 를 반환하는데,
포함
구간 +0 𝔽 부터
23 𝔽 까지이다.
t 가 속한 날의 시(hour)를 반환한다. 다음 단계로 동작한다:
𝔽 (
floor (
ℝ (
t / msPerHour
)
)
modulo
HoursPerDay
)를 반환한다.
21.4.1.15 MinFromTime ( t )
MinFromTime 추상 연산은 t ( 유한 시간 값 )을 인수로 받고,
정수
Number 를 반환하는데,
포함
구간 +0 𝔽 부터
59 𝔽 까지이다.
t 가 속한 시(hour)의 분(minute)을 반환한다. 다음 단계로 동작한다:
𝔽 (
floor (
ℝ (
t / msPerMinute
)
)
modulo
MinutesPerHour
)를 반환한다.
21.4.1.16 SecFromTime ( t )
SecFromTime 추상 연산은 t ( 유한 시간 값 )을 인수로 받고,
정수
Number 를 반환하는데,
포함
구간 +0 𝔽 부터
59 𝔽 까지이다.
t 가 속한 분(minute)의 초(second)를 반환한다. 다음 단계로 동작한다:
𝔽 (
floor (
ℝ (
t / msPerSecond
)
)
modulo
SecondsPerMinute
)를 반환한다.
21.4.1.17 msFromTime ( t )
msFromTime 추상 연산은 t ( 유한 시간 값 )을 인수로 받고,
정수
Number 를 반환하는데,
포함
구간 +0 𝔽 부터
999 𝔽 까지이다.
t 가 속한 초(second)의 밀리초(millisecond)를 반환한다. 다음 단계로 동작한다:
𝔽 (
ℝ (t )
modulo
ℝ (
msPerSecond
)
)를 반환한다.
21.4.1.18 GetUTCEpochNanoseconds ( year ,
month , day , hour , minute , second ,
millisecond , microsecond , nanosecond )
GetUTCEpochNanoseconds 추상 연산은 year ( 정수 ),
month ( 정수 , 포함 구간 1~12 ),
day ( 정수 , 포함 구간 1~31 ),
hour ( 정수 , 포함 구간 0~23 ),
minute ( 정수 , 포함 구간 0~59 ),
second ( 정수 , 포함 구간 0~59 ),
millisecond ( 정수 , 포함 구간 0~999 ),
microsecond ( 정수 , 포함 구간 0~999 ),
nanosecond ( 정수 , 포함 구간 0~999 )를 인수로 받고,
BigInt를 반환한다. 반환된 값은 기점 이후의 나노초 수로, 주어진 ISO 8601 달력 날짜 및 UTC 벽시각에 해당한다. 다음
단계로 동작한다:
date 에
MakeDay (
𝔽 (year ),
𝔽 (month
- 1),
𝔽 (day )
)를 할당한다.
time 에
MakeTime (
𝔽 (hour ),
𝔽 (minute ),
𝔽 (second ),
𝔽 (millisecond )
)를 할당한다.
ms 에
MakeDate (
date , time
)를 할당한다.
Assert :
ms 는 정수 Number 임을 보장한다.
ℤ (
ℝ (ms ) ×
106
+ microsecond × 103
+ nanosecond
)를 반환한다.
21.4.1.19 타임존 식별자
ECMAScript에서 타임존은 타임존 식별자 로 표현되며, 이는
0x0000 ~ 0x007F의 포함 구간 내 코드 유닛으로만 이루어진 문자열입니다.
ECMAScript 구현에서 지원하는 타임존은 사용 가능한 이름이
있는 타임존 일 수 있으며,
이는 타임존 식별자 레코드 의 [[Identifier]] 필드를 통해 표현되며,
AvailableNamedTimeZoneIdentifiers 에서
반환됩니다.
또는 오프셋 타임존 일 수 있으며,
이는 IsTimeZoneOffsetString 이
true 를 반환하는 문자열입니다.
기본 타임존 식별자 는 사용 가능한 이름이 있는
타임존의 대표 식별자입니다.
비기본 타임존 식별자 는 기본 타임존
식별자가 아닌 사용 가능한 이름이 있는 타임존의 식별자입니다.
사용 가능한 이름이 있는 타임존
식별자 는 기본 또는 비기본 타임존 식별자 중 하나입니다.
각각의 사용 가능한 이름이 있는 타임존 식별자는 정확히 하나의 사용 가능한 이름이 있는 타임존에 연결됩니다.
각각의 사용 가능한 이름이 있는 타임존은 정확히 하나의 기본 타임존 식별자와 0개 이상의 비기본 타임존 식별자에 연결됩니다.
ECMAScript 구현은 "UTC" 식별자를 가진 사용 가능한 이름이 있는 타임존을 반드시 지원해야 하며,
이는 UTC 타임존의 기본 타임존 식별자여야 합니다.
그 외에도 임의의 수의 사용 가능한 이름이 있는 타임존을 지원할 수 있습니다.
ECMA-402 국제화 API 명세의 타임존 요구사항을 따르는 구현은 타임존 인식 구현 이라 하며,
타임존 인식 구현은 IANA Time Zone Database의 Zone과 Link 이름에 해당하는 사용 가능한 이름이 있는 타임존을 반드시 지원해야 하며, 오직 그
이름만 사용할 수 있습니다.
이러한 구현에서 기본 타임존 식별자는 Zone 이름이고, 비기본 식별자는 Link 이름입니다. 단, ECMA-402 명세의 AvailableNamedTimeZoneIdentifiers 에
의해 명시적으로 오버라이드된 경우는 예외입니다.
전체 IANA Time Zone Database를 지원하지 않는 구현도 타임존 식별자로 IANA Time Zone Database 이름을 사용하는 것이 권장됩니다.
21.4.1.20 GetNamedTimeZoneEpochNanoseconds (
timeZoneIdentifier , year , month , day ,
hour , minute , second , millisecond ,
microsecond , nanosecond )
구현
정의 추상 연산 GetNamedTimeZoneEpochNanoseconds는
timeZoneIdentifier (문자열), year (정수 ), month (정수 , 포함
구간 1~12), day (정수 , 포함 구간 1~31),
hour (정수 , 포함 구간 0~23),
minute (정수 , 포함 구간 0~59),
second (정수 , 포함 구간 0~59),
millisecond (정수 , 포함 구간 0~999),
microsecond (정수 , 포함 구간 0~999),
nanosecond (정수 , 포함 구간 0~999)를 인수로 받아
BigInt 리스트 를 반환합니다.
반환된 리스트의 각 값은 timeZoneIdentifier 로 지정된 이름이 있는 타임존에서 지정된 ISO 8601 달력 날짜 및 벽시각에 해당하는
기점 이후의 나노초 수를 나타냅니다.
입력이 음수 시간대 전환(예: 서머타임 해제 또는 시간대 규칙 변경으로 오프셋 감소)으로 인해 지역 시간이 두 번 발생하는 경우,
반환되는 리스트 는 2개 이상의 요소를 가지며
오름차순으로 정렬됩니다.
입력이 양수 시간대 전환(예: 서머타임 시작 또는 시간대 규칙 변경으로 오프셋 증가)으로 인해 지역 시간이 건너뛰어진 경우,
반환되는 리스트 는 비어 있습니다.
그 외에는 반환되는 리스트 는 하나의 요소만을 가집니다.
로컬 정치적 규칙이 없는 ECMAScript 구현에서 사용하는 GetNamedTimeZoneEpochNanoseconds의 기본 구현은 다음 단계를 따릅니다:
Assert :
timeZoneIdentifier 가 "UTC" 임을 보장합니다.
epochNanoseconds 에 GetUTCEpochNanoseconds (year ,
month , day , hour , minute ,
second , millisecond , microsecond ,
nanosecond )를 할당합니다.
« epochNanoseconds »를 반환합니다.
참고
타임존 인식 구현 에서는 반드시(그 외에도 권장됨)
IANA Time Zone Database (https://www.iana.org/time-zones/ )의
타임존 정보를 사용해야 합니다.
2017년 11월 5일 America/New_York에서 1:30 AM은 두 번 반복되므로,
GetNamedTimeZoneEpochNanoseconds("America/New_York" , 2017, 11, 5,
1, 30, 0, 0, 0, 0)는 길이가 2인 리스트 를 반환하며,
첫 번째 요소는 05:30 UTC(UTC 오프셋 -04:00인 미국 동부 서머타임 01:30에 해당)이고, 두 번째 요소는 06:30 UTC(UTC
오프셋 -05:00인 미국 동부 표준시 01:30에 해당)입니다.
2017년 3월 12일 America/New_York에서 2:30 AM은 존재하지 않으므로,
GetNamedTimeZoneEpochNanoseconds("America/New_York" , 2017, 3, 12,
2, 30, 0, 0, 0, 0)는 빈 리스트 를 반환합니다.
21.4.1.21 GetNamedTimeZoneOffsetNanoseconds (
timeZoneIdentifier , epochNanoseconds )
구현
정의 추상 연산 GetNamedTimeZoneOffsetNanoseconds는
timeZoneIdentifier (문자열)와 epochNanoseconds (BigInt)를 인수로 받아 정수 를 반환합니다.
반환된 정수 는
timeZoneIdentifier 로 지정된 이름이 있는 타임존의 epochNanoseconds (기점 기준)에서의 UTC로부터의
오프셋(나노초 단위)을 나타냅니다.
로컬 정치적 규칙이 없는 ECMAScript 구현에서 사용하는 GetNamedTimeZoneOffsetNanoseconds의 기본 구현은 다음 단계를 따릅니다:
Assert :
timeZoneIdentifier 가 "UTC" 임을 보장합니다.
0을 반환합니다.
참고
타임존 오프셋 값은 양수 또는 음수일 수 있습니다.
21.4.1.22 타임존 식별자 레코드
타임존 식별자 레코드 는 레코드 로, 사용 가능한 이름이 있는 타임존 식별자 와 해당 기본 타임존 식별자 를 설명하는 데 사용됩니다.
타임존 식별자 레코드는 표 64 에 나열된 필드를 가집니다.
표 64: 타임존 식별자 레코드 필드
참고
[[Identifier]] 가 기본 타임존 식별자 인
경우, [[Identifier]] 는 [[PrimaryIdentifier]] 와 동일합니다.
21.4.1.23 AvailableNamedTimeZoneIdentifiers ( )
구현
정의 추상 연산 AvailableNamedTimeZoneIdentifiers는 인수 없이 호출되며 타임존 식별자 레코드 리스트 를
반환합니다.
결과는 해당 구현에서 모든 사용 가능한 이름이 있는 타임존 식별자 와,
각 기본 타임존 식별자 의 정보를 설명합니다.
리스트 는 각 타임존 식별자 레코드 의 [[Identifier]] 필드 기준으로 정렬됩니다.
타임존 인식 구현 (ECMA-402 국제화 API 구현 포함)는
ECMA-402 명세에서 규정한 대로 AvailableNamedTimeZoneIdentifiers 추상 연산을 반드시 구현해야 합니다.
타임존 인식 구현 가 아닌 경우
AvailableNamedTimeZoneIdentifiers는 다음 단계를 수행합니다:
구현이 어떤 타임존에 대해서도 로컬 정치적 규칙을 포함하지 않는 경우,
« 타임존 식별자 레코드
{ [[Identifier]] : "UTC" , [[PrimaryIdentifier]] : "UTC" } »를
반환한다.
identifiers 에 리스트 로, 고유한
사용 가능한 이름이 있는 타임존 식별자 를
사전식 코드 유닛 순서 대로 정렬하여
할당한다.
result 에 새로운 빈 리스트 를 할당한다.
identifiers 의 각 identifier 에 대해,
primary 에 identifier 를 할당한다.
identifier 가 해당 구현에서 비기본 타임존
식별자 이고 "UTC" 가 아니라면,
primary 에 identifier 와 연결된 기본 타임존 식별자 를
할당한다.
NOTE: 구현에 따라 primary 를 얻을 때 identifier 를 반복적으로
해석해야 할 수도 있음.
record 에 타임존 식별자
레코드
{ [[Identifier]] : identifier , [[PrimaryIdentifier]] : primary }를 할당한다.
record 를 result 에 추가한다.
Assert :
result 는 타임존 식별자
레코드 r 를 포함하며, r .[[Identifier]] 가 "UTC" 이고 r .[[PrimaryIdentifier]] 도 "UTC" 임.
result 를 반환한다.
21.4.1.24 SystemTimeZoneIdentifier ( )
구현
정의 추상 연산 SystemTimeZoneIdentifier는 인수 없이 호출되며 문자열을 반환합니다.
반환값은 호스트
환경 의 현재 타임존을 나타내는 문자열로,
IsTimeZoneOffsetString 이
true 를 반환하는 UTC 오프셋 문자열이거나, 기본 타임존 식별자 일 수 있습니다.
다음 단계를 수행합니다:
구현이 UTC 타임존만 지원한다면 "UTC" 를 반환한다.
systemTimeZoneString 에 호스트 환경 의 현재 타임존을 나타내는
문자열을 할당하는데, 기본 타임존 식별자 또는 오프셋 타임존 식별자임.
systemTimeZoneString 을 반환한다.
참고
Date 객체의 일반적인 기능 수준을 보장하기 위해, SystemTimeZoneIdentifier는 호스트 환경의 타임존 설정에 해당하는 IANA
타임존 이름을 반환하는 것이 권장됩니다(존재한다면).
GetNamedTimeZoneEpochNanoseconds
및 GetNamedTimeZoneOffsetNanoseconds
는 해당 타임존의 표준시 및 서머타임에 관한 로컬 정치적 규칙을 반영해야 합니다(규칙이 존재한다면).
예를 들어, 호스트 환경 이 미국 동부 시간이 선택된 시스템의 브라우저라면,
SystemTimeZoneIdentifier는 "America/New_York" 을 반환합니다.
21.4.1.25 LocalTime ( t )
LocalTime 추상 연산은 t (유한 시간 값 )을 인수로 받아
정수
Number 를 반환합니다.
t 를 UTC에서 로컬 시간으로 변환합니다.
t 시점에 적용되는 표준시 및 서머타임에 관한 로컬 정치적 규칙을 이 섹션에서 규정한 방식으로 적용해 결과를 산출합니다.
다음 단계를 수행합니다:
systemTimeZoneIdentifier 에 SystemTimeZoneIdentifier ()를
할당한다.
IsTimeZoneOffsetString (systemTimeZoneIdentifier )가
true 라면,
offsetNs 에 ParseTimeZoneOffsetString (systemTimeZoneIdentifier )를
할당한다.
그 외,
offsetNs 에 GetNamedTimeZoneOffsetNanoseconds (systemTimeZoneIdentifier ,
ℤ (ℝ (t ) ×
106 ))를 할당한다.
offsetMs 에 truncate (offsetNs /
106 )를 할당한다.
t + 𝔽 (offsetMs )를 반환한다.
참고 1
구현 내에 t 의 로컬 시간에 대한 정치적 규칙 정보가 없으면, 결과는 t 입니다. 이는 SystemTimeZoneIdentifier 가
"UTC" 를 반환하고 GetNamedTimeZoneOffsetNanoseconds 가
0을 반환하기 때문입니다.
참고 2
타임존 인식 구현 에서는 반드시(그 외에도 권장됨)
IANA Time Zone Database (https://www.iana.org/time-zones/ )의
타임존 정보를 사용해야 합니다.
참고 3
음수 시간대 전환(예: 서머타임 해제 또는 오프셋 감소)으로 반복된 시간이 존재할 때, 두 개의 서로 다른 시간 값 t UTC 는 같은 로컬 시간 tlocal 으로 변환됩니다.
LocalTime(UTC (t local )) 는
항상 t local 과 같지는 않을 수 있습니다.
마찬가지로 UTC (LocalTime(t UTC )) 도
항상 t UTC 과 같지는 않을 수 있습니다.
21.4.1.26 UTC ( t )
UTC 추상 연산은 t (Number)를 인수로 받아 시간 값 을 반환합니다.
t 를 로컬 시간에서 UTC 시간 값 으로 변환합니다.
t 시점에 적용되는 표준시 및 서머타임에 관한 로컬 정치적 규칙을 이 섹션에서 규정된 방식으로 적용해 결과를 산출해야 합니다.
다음 단계를 수행합니다:
t 가 유한 이 아니면 NaN 을 반환한다.
systemTimeZoneIdentifier 에 SystemTimeZoneIdentifier ()를
할당한다.
IsTimeZoneOffsetString (systemTimeZoneIdentifier )가
true 면,
offsetNs 에 ParseTimeZoneOffsetString (systemTimeZoneIdentifier )를
할당한다.
그 외,
possibleInstants 에 GetNamedTimeZoneEpochNanoseconds (systemTimeZoneIdentifier ,
ℝ (YearFromTime (t )),
ℝ (MonthFromTime (t ))
+ 1, ℝ (DateFromTime (t )),
ℝ (HourFromTime (t )),
ℝ (MinFromTime (t )),
ℝ (SecFromTime (t )),
ℝ (msFromTime (t )), 0,
0).
NOTE: 다음 단계들은 t 가 음수 시간대 전환(예: 서머타임 해제 또는 오프셋 감소)에서 반복되는 로컬 시간을
나타내거나, 양수 시간대 전환(예: 서머타임 시작 또는 오프셋 증가)에서 건너뛴 로컬 시간일 때 t 가 전환 전
오프셋으로 해석되도록 보장합니다.
possibleInstants 가 비어 있지 않으면,
disambiguatedInstant 에 possibleInstants [0]을
할당한다.
그 외,
NOTE: t 는 양수 시간대 전환(예: 서머타임 시작 또는 오프셋 증가)에서 건너뛴 로컬 시간을
나타냅니다.
possibleInstantsBefore 에 GetNamedTimeZoneEpochNanoseconds (systemTimeZoneIdentifier ,
ℝ (YearFromTime (tBefore )),
ℝ (MonthFromTime (tBefore ))
+ 1, ℝ (DateFromTime (tBefore )),
ℝ (HourFromTime (tBefore )),
ℝ (MinFromTime (tBefore )),
ℝ (SecFromTime (tBefore )),
ℝ (msFromTime (tBefore )),
0, 0), 여기서 tBefore 는 t 보다 작은 가장 큰 정수 Number 로,
possibleInstantsBefore 가 비어있지 않은 값(즉, tBefore 는
전환 이전 마지막 로컬 시간을 나타냄).
disambiguatedInstant 에 possibleInstantsBefore 의
마지막 요소를 할당한다.
offsetNs 에 GetNamedTimeZoneOffsetNanoseconds (systemTimeZoneIdentifier ,
disambiguatedInstant )를 할당한다.
offsetMs 에 truncate (offsetNs /
106 )를 할당한다.
t - 𝔽 (offsetMs )를 반환한다.
입력 t 는 명목상 시간 값 이지만, 임의의 Number 값일 수 있습니다.
알고리즘은 t 를 시간 값 의 범위로 제한해서는 안 됩니다.
예를 들어, 최대 시간 값 은 8.64 × 1015 로,
"+275760-09-13T00:00:00Z" 에 해당합니다.
만약 로컬 타임존 오프셋이 그 시점에 UTC보다 1시간 빠르다면, 8.64 × 1015 + 3.6 × 106 입력은
"+275760-09-13T01:00:00+01:00" 에 해당합니다.
구현 내에 t 의 로컬 시간에 대한 정치적 규칙 정보가 없으면, 결과는 t 입니다. 이는 SystemTimeZoneIdentifier 가
"UTC" 를 반환하고 GetNamedTimeZoneOffsetNanoseconds 가
0을 반환하기 때문입니다.
참고 1
타임존 인식 구현 에서는 반드시(그 외에도 권장됨)
IANA Time Zone Database (https://www.iana.org/time-zones/ )의
타임존 정보를 사용해야 합니다.
2017년 11월 5일 America/New_York에서 1:30 AM은 두 번 반복(가을 뒤로 이동)이지만, 반드시 1:30 AM UTC-04로
해석되어야 하며 1:30 AM UTC-05가 아님.
UTC(TimeClip (MakeDate (MakeDay (2017, 10, 5), MakeTime (1, 30, 0, 0))))에서
offsetMs 값은 -4 × msPerHour 입니다.
2017년 3월 12일 America/New_York에서 2:30 AM은 존재하지 않지만, 반드시 2:30 AM UTC-05(= 3:30 AM
UTC-04)로 해석되어야 합니다.
UTC(TimeClip (MakeDate (MakeDay (2017, 2, 12), MakeTime (2, 30, 0, 0))))에서
offsetMs 값은 -5 × msPerHour 입니다.
참고 2
UTC(LocalTime (t UTC )) 는
항상 t UTC 과 같지는 않습니다. 마찬가지로
LocalTime (UTC(t local )) 도
항상 t local 과 같지는 않습니다.
21.4.1.27 MakeTime ( hour , min ,
sec , ms )
MakeTime 추상 연산은 hour (Number), min (Number), sec (Number),
ms (Number)를 인수로 받아 Number를 반환합니다. 밀리초 수를 계산합니다. 다음 단계를 수행합니다:
hour 가 유한 이 아니거나, min 이 유한 이 아니거나,
sec 이 유한 이 아니거나, ms 가 유한 이 아니면
NaN 을 반환한다.
h 에 𝔽 (!
ToIntegerOrInfinity (hour ))를
할당한다.
m 에 𝔽 (!
ToIntegerOrInfinity (min ))를
할당한다.
s 에 𝔽 (!
ToIntegerOrInfinity (sec ))를
할당한다.
milli 에 𝔽 (! ToIntegerOrInfinity (ms ))를
할당한다.
((h × msPerHour + m × msPerMinute ) + s ×
msPerSecond ) + milli 를
반환한다.
참고
MakeTime의 산술 연산은 부동소수점 연산이므로 결합법칙이 성립하지 않으며, 연산은 지정된 순서대로 수행해야 합니다.
21.4.1.28 MakeDay ( year , month ,
date )
MakeDay 추상 연산은 year (Number), month (Number), date (Number)를
인수로 받아 Number를 반환합니다. 일(day) 수를 계산합니다. 호출 시 다음 단계를 수행합니다:
year 가 유한 이 아니거나, month 가 유한 이 아니거나,
date 가 유한 이 아니면 NaN 을 반환한다.
y 에 𝔽 (!
ToIntegerOrInfinity (year ))를
할당한다.
m 에 𝔽 (!
ToIntegerOrInfinity (month ))를
할당한다.
dt 에 𝔽 (!
ToIntegerOrInfinity (date ))를
할당한다.
ym 에 y + 𝔽 (floor (ℝ (m ) / 12))를 할당한다.
ym 이 유한 이 아니면 NaN 을 반환한다.
mn 에 𝔽 (ℝ (m ) modulo 12)를 할당한다.
유한
시간 값 t 를
찾는데,
YearFromTime (t )가
ym 이고,
MonthFromTime (t )가
mn 이고,
DateFromTime (t )가
1 𝔽 일 것.
만약 불가능하다면(인수값이 범위를 벗어나는 경우 등), NaN 을 반환한다.
Day (t ) + dt -
1 𝔽 를 반환한다.
21.4.1.29 MakeDate ( day , time )
MakeDate 추상 연산은 day (Number)와 time (Number)를 인수로 받고 Number를 반환합니다. 밀리초 값을
계산합니다. 호출 시 다음 단계를 수행합니다:
day 가 유한 이 아니거나 time 이 유한 이 아니면
NaN 을 반환한다.
tv 에 day × msPerDay + time 을 할당한다.
tv 가 유한 이 아니면 NaN 을 반환한다.
tv 를 반환한다.
21.4.1.30 MakeFullYear ( year )
MakeFullYear 추상 연산은 year (Number)를 인수로 받아 정수 Number 또는
NaN 을 반환합니다. year 의 정수 부분을 해석하여 해당하는 "full year"를 반환하며, 0~99 구간 값을 1900년
이후의 연도로 해석합니다. 역 그레고리력과의 정렬을 위해 "full year"는 0년(1 B.C.) 이후의 전체 연수(부호 포함)로 정의됩니다. 호출 시 다음 단계를
수행합니다:
year 가 NaN 이면 NaN 을 반환한다.
truncated 에 ! ToIntegerOrInfinity (year )를
할당한다.
truncated 가 0~99의 포함 구간 에 있으면
1900 𝔽 + 𝔽 (truncated )를 반환한다.
𝔽 (truncated )를 반환한다.
21.4.1.31 TimeClip ( time )
TimeClip 추상 연산은 time (Number)를 인수로 받아 Number를 반환합니다. 밀리초 값을 계산합니다. 호출 시 다음 단계를
수행합니다:
time 이 유한 이 아니면 NaN 을 반환한다.
abs (ℝ (time )) >
8.64 × 1015 이면 NaN 을 반환한다.
𝔽 (!
ToIntegerOrInfinity (time ))를
반환한다.
21.4.1.32 날짜-시간 문자열 형식
ECMAScript는 ISO 8601 달력 날짜 확장 형식을 단순화한 문자열 교환 형식을 정의합니다. 형식은 다음과 같습니다:
YYYY-MM-DDTHH:mm:ss.sssZ
각 요소의 의미는 다음과 같습니다:
YYYY
역 그레고리력에서 0000~9999 사이의 4자리 연도이거나, 확장 연도 로
"+" 또는 "-" 다음에 6자리 십진수가 옵니다.
-
"-" (하이픈)이 문자열에 두 번 등장합니다.
MM
01(1월)부터 12(12월)까지의 두 자리 십진수 월입니다.
DD
01~31 사이의 두 자리 십진수 날짜(일)입니다.
T
"T" 가 문자열에 그대로 등장하여 시간 요소의 시작을 표시합니다.
HH
자정 이후 경과한 정시(hour)의 수로서, 00~24 사이의 두 자리 십진수입니다.
:
":" (콜론)이 문자열에 두 번 등장합니다.
mm
시(hour) 시작 이후 경과한 분(minute) 수로서, 00~59 사이의 두 자리 십진수입니다.
ss
분(minute) 시작 이후 경과한 초(second) 수로서, 00~59 사이의 두 자리 십진수입니다.
.
"." (점)이 문자열에 그대로 등장합니다.
sss
초(second) 시작 이후 경과한 밀리초(millisecond) 수로서, 3자리 십진수입니다.
Z
UTC 오프셋 표현으로 "Z" (오프셋 없는 UTC) 또는 "+" 또는
"-" 다음에 HH:mm 시간 표현이 옵니다(UTC보다 앞서거나 뒤처진 현지
시간을 나타내는 타임존 오프셋 문자열 형식 의
부분 집합).
이 형식에는 날짜만 나타내는 형태도 포함됩니다:
YYYY
YYYY-MM
YYYY-MM-DD
또한 위의 날짜 형식 바로 뒤에 아래의 시간 형식 중 하나와 선택적 UTC 오프셋 표현이 붙는 “날짜-시간” 형식도 포함됩니다:
THH:mm
THH:mm:ss
THH:mm:ss.sss
범위를 벗어나거나 규격에 맞지 않는 요소가 포함된 문자열은 이 형식의 유효한 인스턴스가 아닙니다.
참고 1
모든 날은 자정에 시작하고 자정에 끝나므로, 날짜 하나에 대해 00:00과 24:00 두 표기를 통해 두
자정을 구분할 수 있습니다. 즉, 1995-02-04T24:00과 1995-02-05T00:00 표기는
정확히 동일한 시점을 나타냅니다. 후자(종료 자정)의 해석은 ISO 8601과 일치하지만, ISO 8601에서는 시간 구간을 설명할 때만 허용하며 단일
시점을 표현할 때는 허용하지 않습니다.
참고 2
CET, EST 등과 같은 시민 시간대 약어에 대한 국제 표준은 존재하지 않으며 같은 약어가 상이한 시간대를 나타내기도 합니다. 이런 이유로 ISO
8601과 이 형식 모두 시간대 오프셋의 숫자 표현만을 명시합니다.
21.4.1.32.1 확장 연도
1월 1일 1970년을 기준으로 약 273,790년 전후의 시간 값 전체 범위를
표현하려면 0년 이전 또는 9999년 이후 연도를 나타낼 수 있어야 합니다(21.4.1.1 참조). ISO 8601은 연도
표기의 확장을 허용하지만, 정보 교환 당사자 간의 합의가 있어야 합니다. ECMAScript 단순화 형식에서는 확장 연도 표기가 6자리이며 항상 + 또는 -
부호가 앞에 옵니다. 0년은 양수로 간주되어 반드시 + 부호가 붙어야 하며, -000000 표기는 유효하지 않습니다. 확장 연도가 날짜-시간 문자열 형식 과 일치하나 시간 값 범위를 벗어나는 시간을 나타내는 경우
Date.parse 에서 인식할 수 없어 해당 함수는
NaN 을 반환하며 구현별 동작이나 휴리스틱으로 대체하지 않습니다.
참고
확장 연도가 포함된 날짜-시간 값 예시:
-271821-04-20T00:00:00Z
271822 B.C.
-000001-01-01T00:00:00Z
2 B.C.
+000000-01-01T00:00:00Z
1 B.C.
+000001-01-01T00:00:00Z
1 A.D.
+001970-01-01T00:00:00Z
1970 A.D.
+002009-12-15T00:00:00Z
2009 A.D.
+275760-09-13T00:00:00Z
275760 A.D.
21.4.1.33 타임존 오프셋 문자열 형식
ECMAScript는 ISO 8601에서 파생된 UTC 오프셋의 문자열 교환 형식을 정의합니다.
형식은 아래의 문법으로 설명합니다.
구문
UTCOffset :::
ASCIISign
Hour
ASCIISign
Hour
HourSubcomponents [+Extended]
ASCIISign
Hour
HourSubcomponents [~Extended]
ASCIISign :::
one of + -
Hour :::
0
DecimalDigit
1
DecimalDigit
20
21
22
23
HourSubcomponents [Extended]
:::
TimeSeparator [?Extended]
MinuteSecond
TimeSeparator [?Extended]
MinuteSecond
TimeSeparator [?Extended]
MinuteSecond
TemporalDecimalFraction opt
TimeSeparator [Extended]
::: [+Extended]
:
[~Extended]
[empty]
MinuteSecond :::
0
DecimalDigit
1
DecimalDigit
2
DecimalDigit
3
DecimalDigit
4
DecimalDigit
5
DecimalDigit
TemporalDecimalFraction
:::
TemporalDecimalSeparator
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
::: one of .
,
21.4.1.33.1 IsTimeZoneOffsetString ( offsetString
)
IsTimeZoneOffsetString 추상 연산은 offsetString (문자열)을 인수로 받아 Boolean을 반환합니다. 반환값은
offsetString 이 UTCOffset 문법에 적합한지 여부를 나타냅니다. 호출 시 다음 단계를
수행합니다:
parseResult 에 ParseText (offsetString ,
UTCOffset )를 할당한다.
parseResult 가 오류
리스트 이면 false 를 반환한다.
true 를 반환한다.
21.4.1.33.2 ParseTimeZoneOffsetString (
offsetString )
ParseTimeZoneOffsetString 추상 연산은 offsetString (문자열)을 인수로 받아 정수 를 반환합니다. 반환값은
offsetString 에 해당하는 UTC 오프셋(나노초 단위)입니다. 호출 시 다음 단계를 수행합니다:
parseResult 에 ParseText (offsetString ,
UTCOffset )를 할당한다.
Assert : parseResult 가 오류 리스트 가
아님을 보장한다.
Assert : parseResult 에 ASCIISign 구문 노드 가 포함되어 있다.
parsedSign 에 매칭된 소스
텍스트 중 ASCIISign 구문 노드 에 해당하는 것을 할당한다.
parsedSign 이 U+002D(HYPHEN-MINUS)이면,
sign 에 -1을 할당한다.
그 외,
sign 에 1을 할당한다.
NOTE: 아래의 StringToNumber 적용 과정에서는, 각 파싱된
값이 충분히 짧은 십진수 문자열이므로 정밀도가 손실되지 않습니다.
Assert : parseResult 에 Hour 구문 노드 가 포함되어 있다.
parsedHours 에 매칭된 소스
텍스트 중 Hour 구문 노드 에 해당하는 것을 할당한다.
hours 에 ℝ (StringToNumber (CodePointsToString (parsedHours )))를
할당한다.
parseResult 에 MinuteSecond 구문 노드 가 포함되어 있지 않으면,
minutes 에 0을 할당한다.
그 외,
parsedMinutes 에 매칭된
소스 텍스트 중 첫 번째 MinuteSecond 구문 노드 에 해당하는 것을
할당한다.
minutes 에 ℝ (StringToNumber (CodePointsToString (parsedMinutes )))를
할당한다.
parseResult 에 두 개의 MinuteSecond 구문 노드 가 포함되어 있지 않으면,
seconds 에 0을 할당한다.
그 외,
parsedSeconds 에 매칭된
소스 텍스트 중 두 번째 MinuteSecond 구문 노드 에 해당하는 것을
할당한다.
seconds 에 ℝ (StringToNumber (CodePointsToString (parsedSeconds )))를
할당한다.
parseResult 에 TemporalDecimalFraction
구문 노드 가 포함되어 있지 않으면,
nanoseconds 에 0을 할당한다.
그 외,
parsedFraction 에 매칭된
소스 텍스트 중 TemporalDecimalFraction
구문 노드 에 해당하는 것을
할당한다.
fraction 에 문자열
연결 결과 CodePointsToString (parsedFraction )과
"000000000" 을 할당한다.
nanosecondsString 에 부분 문자열
fraction 의 1~10번째를 할당한다.
nanoseconds 에 ℝ (StringToNumber (nanosecondsString ))를
할당한다.
sign × (((hours × 60 + minutes ) × 60 +
seconds ) × 109 + nanoseconds )를 반환한다.
21.4.2 Date 생성자
Date 생성자 :
%Date% 이다.
"Date" 프로퍼티의 초기값이며, 글로벌 객체 에 존재한다.
생성자 로 호출
시 새로운 Date를 생성 및 초기화한다.
생성자 가 아닌
함수로 호출 시, 현재 시간(UTC)을 나타내는 문자열을 반환한다.
인수의 개수와 타입에 따라 동작이 달라지는 함수이다.
클래스 정의의 extends 절 값으로 사용될 수 있다. Date의 동작을 상속하려는 서브클래스 생성자 는 [[DateValue]] 내부 슬롯으로 하위 클래스 인스턴스를 생성 및 초기화하기 위해 반드시 Date 생성자 에 대한
super 호출을 포함해야 한다.
21.4.2.1 Date ( ...values )
이 함수는 호출 시 다음 단계를 수행한다:
NewTarget이 undefined 이면,
now 에 현재 시간을 나타내는 시간
값 (UTC)를 할당한다.
ToDateString (now )를
반환한다.
numberOfArgs 에 values 의 요소 개수를 할당한다.
numberOfArgs = 0이면,
dv 에 현재 시간을 나타내는 시간
값 (UTC)를 할당한다.
numberOfArgs = 1이면,
value 에 values [0]을 할당한다.
value 가 객체 이고 value 에 [[DateValue]] 내부 슬롯이 있으면,
tv 에 value .[[DateValue]] 를 할당한다.
그 외,
v 에 ? ToPrimitive (value )를
할당한다.
v 가 문자열 이면,
Assert : 다음 단계는
v 가 문자열이므로 비정상
종료 를 반환하지 않는다.
tv 에 v 를 날짜로 파싱한 결과를 할당하는데,
parse 메서드와 정확히 동일한 방식으로 파싱한다 (21.4.3.2 참조).
그 외,
tv 에 ? ToNumber (v )를
할당한다.
dv 에 TimeClip (tv )를 할당한다.
그 외,
Assert : numberOfArgs ≥ 2임을
보장한다.
y 에 ? ToNumber (values [0])를
할당한다.
m 에 ? ToNumber (values [1])를
할당한다.
numberOfArgs > 2이면 dt 에 ? ToNumber (values [2])를
할당하고, 아니면 dt 에 1 𝔽 을 할당한다.
numberOfArgs > 3이면 h 에 ? ToNumber (values [3])를
할당하고, 아니면 h 에 +0 𝔽 을 할당한다.
numberOfArgs > 4이면 min 에 ? ToNumber (values [4])를
할당하고, 아니면 min 에 +0 𝔽 을 할당한다.
numberOfArgs > 5이면 s 에 ? ToNumber (values [5])를
할당하고, 아니면 s 에 +0 𝔽 을 할당한다.
numberOfArgs > 6이면 milli 에 ? ToNumber (values [6])를
할당하고, 아니면 milli 에 +0 𝔽 을 할당한다.
yr 에 MakeFullYear (y )를
할당한다.
finalDate 에 MakeDate (MakeDay (yr ,
m , dt ), MakeTime (h ,
min , s , milli ))를 할당한다.
dv 에 TimeClip (UTC (finalDate ))를 할당한다.
O 에 ? OrdinaryCreateFromConstructor (NewTarget,
"%Date.prototype%" , « [[DateValue]] »)
을 할당한다.
O .[[DateValue]] 에 dv 를 설정한다.
O 를 반환한다.
21.4.3 Date 생성자의 프로퍼티
Date 생성자 :
21.4.3.1 Date.now ( )
이 함수는 호출 시점의 UTC 날짜 및 시간을 나타내는 시간 값 을 반환한다.
21.4.3.2 Date.parse ( string )
이 함수는 인수에 ToString 연산자를 적용한다. ToString 결과가 비정상 종료 면 Completion Record 를
즉시 반환한다. 그렇지 않으면, 결과 문자열을 날짜와 시간으로 해석한다. 반환값은 해당 날짜 및 시간에 대응하는 UTC 시간 값 인 Number이다. 문자열은 내용에 따라 현지
시간, UTC 시간, 또는 다른 타임존의 시간으로 해석될 수 있다. 함수는 먼저 Date Time String Format (21.4.1.32 ) 및 확장 연도에 따라 문자열을 파싱하려
시도한다. 해당 형식에 맞지 않으면 구현별 휴리스틱이나 구현별 날짜 형식으로 대체할 수 있다. 인식 불가하거나 범위 초과 형식 요소가 포함된 문자열은
NaN 을 반환해야 한다.
문자열이 Date Time String Format 에 적합하면,
누락된 형식 요소는 대체 값으로 채워진다. MM 또는 DD 요소가 없으면 "01" 이
사용된다. HH, mm, ss 요소가 없으면 "00" 이
사용된다. sss 요소가 없으면 "000" 이 사용된다. UTC 오프셋 표기가 없으면 날짜만 있는 형식은
UTC 시간으로, 날짜-시간 형식은 로컬 시간으로 해석된다.
x가 해당 ECMAScript 구현에서 밀리초 값이 0인 Date라면, 아래 모든 표현식은 (모든 프로퍼티가 초기값일 때) 같은 숫자 값을
반환해야 한다:
x.valueOf ()
Date .parse (x.toString ())
Date .parse (x.toUTCString ())
Date .parse (x.toISOString ())
하지만 아래 표현식은
Date .parse (x.toLocaleString ())
앞선 세 표현식과 같은 Number 값을 반환할 필요가 없으며, 일반적으로 이 함수가 Date Time String Format (21.4.1.32 )에 맞지 않는 문자열 또는 해당 구현에서
toString이나 toUTCString 메서드로 생성할 수 없는 문자열을 받는 경우 반환값은 구현
정의 이다.
21.4.3.3 Date.prototype
Date.prototype의 초기값은 Date 프로토타입 객체 이다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }이다.
21.4.3.4 Date.UTC ( year [ , month [ ,
date [ , hours [ , minutes [ , seconds [ ,
ms ] ] ] ] ] ] )
이 함수는 호출 시 다음 단계를 수행한다:
y 에 ? ToNumber (year )를 할당한다.
month 가 있으면 m 에 ? ToNumber (month )를, 없으면
m 에 +0 𝔽 을 할당한다.
date 가 있으면 dt 에 ? ToNumber (date )를, 없으면
dt 에 1 𝔽 을 할당한다.
hours 가 있으면 h 에 ? ToNumber (hours )를, 없으면
h 에 +0 𝔽 을 할당한다.
minutes 가 있으면 min 에 ? ToNumber (minutes )를, 없으면
min 에 +0 𝔽 을 할당한다.
seconds 가 있으면 s 에 ? ToNumber (seconds )를, 없으면
s 에 +0 𝔽 을 할당한다.
ms 가 있으면 milli 에 ? ToNumber (ms )를, 없으면
milli 에 +0 𝔽 을 할당한다.
yr 에 MakeFullYear (y )를 할당한다.
TimeClip (MakeDate (MakeDay (yr , m ,
dt ), MakeTime (h , min ,
s , milli )))를 반환한다.
이 함수의 "length" 프로퍼티 값은
7 𝔽 이다.
참고
이 함수는 Date 생성자 와 두 가지가 다르다: Date를 생성하는 대신 Number로
시간 값 을 반환하며, 인수를 로컬 시간
대신 UTC 기준으로 해석한다.
21.4.4 Date 프로토타입 객체의 프로퍼티
Date 프로토타입 객체 :
%Date.prototype% 이다.
일반
객체 이다.
Date 인스턴스가 아니며 [[DateValue]] 내부 슬롯을 가지지 않는다.
[[Prototype]] 내부 슬롯을 가지며, 그 값은 %Object.prototype% 이다.
별도로 명시되지 않는 한, 아래에 정의된 Date 프로토타입 객체의 메서드는 generic이 아니며, 이들에 전달되는 this 값은 초기화된
시간 값 을 가진 [[DateValue]] 내부 슬롯이 있는 객체여야 한다.
21.4.4.1 Date.prototype.constructor
Date.prototype.constructor의 초기값은 %Date% 이다.
21.4.4.2 Date.prototype.getDate ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
DateFromTime (LocalTime (t ))을 반환한다.
21.4.4.3 Date.prototype.getDay ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
WeekDay (LocalTime (t ))을 반환한다.
21.4.4.4 Date.prototype.getFullYear ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
YearFromTime (LocalTime (t ))을 반환한다.
21.4.4.5 Date.prototype.getHours ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
HourFromTime (LocalTime (t ))을 반환한다.
21.4.4.6 Date.prototype.getMilliseconds ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
msFromTime (LocalTime (t ))을 반환한다.
21.4.4.7 Date.prototype.getMinutes ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
MinFromTime (LocalTime (t ))을 반환한다.
21.4.4.8 Date.prototype.getMonth ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
MonthFromTime (LocalTime (t ))을 반환한다.
21.4.4.9 Date.prototype.getSeconds ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
SecFromTime (LocalTime (t ))을 반환한다.
21.4.4.10 Date.prototype.getTime ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
dateObject .[[DateValue]] 를 반환한다.
21.4.4.11 Date.prototype.getTimezoneOffset ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
(t - LocalTime (t )) / msPerMinute 를 반환한다.
21.4.4.12 Date.prototype.getUTCDate ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
DateFromTime (t )를 반환한다.
21.4.4.13 Date.prototype.getUTCDay ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
WeekDay (t )를 반환한다.
21.4.4.14 Date.prototype.getUTCFullYear ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
YearFromTime (t )를 반환한다.
21.4.4.15 Date.prototype.getUTCHours ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
HourFromTime (t )를 반환한다.
21.4.4.16 Date.prototype.getUTCMilliseconds ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
msFromTime (t )를 반환한다.
21.4.4.17 Date.prototype.getUTCMinutes ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
MinFromTime (t )를 반환한다.
21.4.4.18 Date.prototype.getUTCMonth ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
MonthFromTime (t )를 반환한다.
21.4.4.19 Date.prototype.getUTCSeconds ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
SecFromTime (t )를 반환한다.
21.4.4.20 Date.prototype.setDate ( date )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
dt 에 ? ToNumber (date )를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
t 에 LocalTime (t )를 할당한다.
newDate 에 MakeDate (MakeDay (YearFromTime (t ),
MonthFromTime (t ),
dt ), TimeWithinDay (t ))를 할당한다.
u 에 TimeClip (UTC (newDate ))를
할당한다.
dateObject .[[DateValue]] 에 u 를 설정한다.
u 를 반환한다.
21.4.4.21 Date.prototype.setFullYear ( year [ ,
month [ , date ] ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
y 에 ? ToNumber (year )를 할당한다.
t 가 NaN 이면 t 에
+0 𝔽 을 할당하고, 아니면 t 에 LocalTime (t )을 할당한다.
month 가 없으면 m 에 MonthFromTime (t )을, 있으면
m 에 ? ToNumber (month )을 할당한다.
date 가 없으면 dt 에 DateFromTime (t )을, 있으면
dt 에 ? ToNumber (date )을 할당한다.
newDate 에 MakeDate (MakeDay (y ,
m , dt ), TimeWithinDay (t ))를 할당한다.
u 에 TimeClip (UTC (newDate ))를
할당한다.
dateObject .[[DateValue]] 에 u 를 설정한다.
u 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 3 𝔽 이다.
참고
month 가 없으면 이 메서드는 month 가 getMonth() 값인 것처럼 동작한다.
date 가 없으면 date 가 getDate() 값인 것처럼 동작한다.
21.4.4.22 Date.prototype.setHours ( hour [ ,
min [ , sec [ , ms ] ] ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
h 에 ? ToNumber (hour )를 할당한다.
min 이 있으면 m 에 ? ToNumber (min )을 할당한다.
sec 이 있으면 s 에 ? ToNumber (sec )을 할당한다.
ms 이 있으면 milli 에 ? ToNumber (ms )을 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
t 에 LocalTime (t )을 할당한다.
min 이 없으면 m 에 MinFromTime (t )을 할당한다.
sec 이 없으면 s 에 SecFromTime (t )을 할당한다.
ms 이 없으면 milli 에 msFromTime (t )을 할당한다.
date 에 MakeDate (Day (t ), MakeTime (h , m ,
s , milli ))를 할당한다.
u 에 TimeClip (UTC (date ))를 할당한다.
dateObject .[[DateValue]] 에 u 를 설정한다.
u 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 4 𝔽 이다.
참고
min 이 없으면 이 메서드는 min 이 getMinutes() 값인 것처럼 동작한다.
sec 이 없으면 sec 이 getSeconds() 값인 것처럼, ms 가
없으면 ms 가 getMilliseconds() 값인 것처럼 동작한다.
21.4.4.23 Date.prototype.setMilliseconds ( ms )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
ms 에 ? ToNumber (ms )를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
t 에 LocalTime (t )을 할당한다.
time 에 MakeTime (HourFromTime (t ),
MinFromTime (t ), SecFromTime (t ),
ms )를 할당한다.
u 에 TimeClip (UTC (MakeDate (Day (t ),
time )))를 할당한다.
dateObject .[[DateValue]] 에 u 를 설정한다.
u 를 반환한다.
21.4.4.24 Date.prototype.setMinutes ( min [ ,
sec [ , ms ] ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
m 에 ? ToNumber (min )를 할당한다.
sec 이 있으면 s 에 ? ToNumber (sec )을 할당한다.
ms 이 있으면 milli 에 ? ToNumber (ms )을 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
t 에 LocalTime (t )을 할당한다.
sec 이 없으면 s 에 SecFromTime (t )을 할당한다.
ms 이 없으면 milli 에 msFromTime (t )을 할당한다.
date 에 MakeDate (Day (t ), MakeTime (HourFromTime (t ),
m , s , milli ))를 할당한다.
u 에 TimeClip (UTC (date ))를 할당한다.
dateObject .[[DateValue]] 에 u 를 설정한다.
u 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 3 𝔽 이다.
참고
sec 이 없으면 이 메서드는 sec 이 getSeconds() 값인 것처럼 동작한다.
ms 가 없으면 ms 가 getMilliseconds() 값인 것처럼 동작한다.
21.4.4.25 Date.prototype.setMonth ( month [ ,
date ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
m 에 ? ToNumber (month )를 할당한다.
date 가 있으면 dt 에 ? ToNumber (date )를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
t 에 LocalTime (t )을 할당한다.
date 가 없으면 dt 에 DateFromTime (t )을 할당한다.
newDate 에 MakeDate (MakeDay (YearFromTime (t ),
m , dt ), TimeWithinDay (t ))를 할당한다.
u 에 TimeClip (UTC (newDate ))를
할당한다.
dateObject .[[DateValue]] 에 u 를 설정한다.
u 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 2 𝔽 이다.
참고
date 가 없으면 이 메서드는 date 가 getDate() 값인 것처럼 동작한다.
21.4.4.26 Date.prototype.setSeconds ( sec [ ,
ms ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
s 에 ? ToNumber (sec )를 할당한다.
ms 이 있으면 milli 에 ? ToNumber (ms )을 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
t 에 LocalTime (t )을 할당한다.
ms 이 없으면 milli 에 msFromTime (t )을 할당한다.
date 에 MakeDate (Day (t ), MakeTime (HourFromTime (t ),
MinFromTime (t ),
s , milli ))를 할당한다.
u 에 TimeClip (UTC (date ))를 할당한다.
dateObject .[[DateValue]] 에 u 를 설정한다.
u 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 2 𝔽 이다.
참고
ms 가 없으면 이 메서드는 ms 가 getMilliseconds() 값인 것처럼 동작한다.
21.4.4.27 Date.prototype.setTime ( time )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 ? ToNumber (time )를 할당한다.
v 에 TimeClip (t )를 할당한다.
dateObject .[[DateValue]] 에 v 를 설정한다.
v 를 반환한다.
21.4.4.28 Date.prototype.setUTCDate ( date )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
dt 에 ? ToNumber (date )를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
newDate 에 MakeDate (MakeDay (YearFromTime (t ),
MonthFromTime (t ),
dt ), TimeWithinDay (t ))를 할당한다.
v 에 TimeClip (newDate )를 할당한다.
dateObject .[[DateValue]] 에 v 를 설정한다.
v 를 반환한다.
21.4.4.29 Date.prototype.setUTCFullYear ( year [ ,
month [ , date ] ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 t 에
+0 𝔽 을 할당한다.
y 에 ? ToNumber (year )를 할당한다.
month 가 없으면 m 에 MonthFromTime (t )을, 있으면
m 에 ? ToNumber (month )을 할당한다.
date 가 없으면 dt 에 DateFromTime (t )을, 있으면
dt 에 ? ToNumber (date )을 할당한다.
newDate 에 MakeDate (MakeDay (y ,
m , dt ), TimeWithinDay (t ))를 할당한다.
v 에 TimeClip (newDate )를 할당한다.
dateObject .[[DateValue]] 에 v 를 설정한다.
v 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 3 𝔽 이다.
참고
month 가 없으면 이 메서드는 month 가 getUTCMonth() 값인 것처럼
동작한다. date 가 없으면 date 가 getUTCDate() 값인 것처럼 동작한다.
21.4.4.30 Date.prototype.setUTCHours ( hour [ ,
min [ , sec [ , ms ] ] ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
h 에 ? ToNumber (hour )를 할당한다.
min 이 있으면 m 에 ? ToNumber (min )을 할당한다.
sec 이 있으면 s 에 ? ToNumber (sec )을 할당한다.
ms 이 있으면 milli 에 ? ToNumber (ms )을 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
min 이 없으면 m 에 MinFromTime (t )을 할당한다.
sec 이 없으면 s 에 SecFromTime (t )을 할당한다.
ms 이 없으면 milli 에 msFromTime (t )을 할당한다.
date 에 MakeDate (Day (t ), MakeTime (h , m ,
s , milli ))를 할당한다.
v 에 TimeClip (date )를 할당한다.
dateObject .[[DateValue]] 에 v 를 설정한다.
v 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 4 𝔽 이다.
참고
min 이 없으면 이 메서드는 min 이 getUTCMinutes() 값인 것처럼 동작한다.
sec 이 없으면 sec 이 getUTCSeconds() 값인 것처럼,
ms 가 없으면 ms 가 getUTCMilliseconds() 값인 것처럼 동작한다.
21.4.4.31 Date.prototype.setUTCMilliseconds ( ms )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
ms 에 ? ToNumber (ms )를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
time 에 MakeTime (HourFromTime (t ),
MinFromTime (t ), SecFromTime (t ),
ms )를 할당한다.
v 에 TimeClip (MakeDate (Day (t ),
time ))를 할당한다.
dateObject .[[DateValue]] 에 v 를 설정한다.
v 를 반환한다.
21.4.4.32 Date.prototype.setUTCMinutes ( min [ ,
sec [ , ms ] ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
m 에 ? ToNumber (min )를 할당한다.
sec 이 있으면 s 에 ? ToNumber (sec )을 할당한다.
ms 이 있으면 milli 에 ? ToNumber (ms )을 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
sec 이 없으면 s 에 SecFromTime (t )을 할당한다.
ms 이 없으면 milli 에 msFromTime (t )을 할당한다.
date 에 MakeDate (Day (t ), MakeTime (HourFromTime (t ),
m , s , milli ))를 할당한다.
v 에 TimeClip (date )를 할당한다.
dateObject .[[DateValue]] 에 v 를 설정한다.
v 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 3 𝔽 이다.
참고
sec 이 없으면 이 메서드는 sec 이 getUTCSeconds() 값인 것처럼 동작한다.
ms 가 없으면 ms 가 getUTCMilliseconds() 값인 것처럼 동작한다.
21.4.4.33 Date.prototype.setUTCMonth ( month [ ,
date ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
m 에 ? ToNumber (month )를 할당한다.
date 가 있으면 dt 에 ? ToNumber (date )를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
date 가 없으면 dt 에 DateFromTime (t )을 할당한다.
newDate 에 MakeDate (MakeDay (YearFromTime (t ),
m , dt ), TimeWithinDay (t ))를 할당한다.
v 에 TimeClip (newDate )를 할당한다.
dateObject .[[DateValue]] 에 v 를 설정한다.
v 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 2 𝔽 이다.
참고
date 가 없으면 이 메서드는 date 가 getUTCDate() 값인 것처럼 동작한다.
21.4.4.34 Date.prototype.setUTCSeconds ( sec [ ,
ms ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
s 에 ? ToNumber (sec )를 할당한다.
ms 이 있으면 milli 에 ? ToNumber (ms )을 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
ms 이 없으면 milli 에 msFromTime (t )을 할당한다.
date 에 MakeDate (Day (t ), MakeTime (HourFromTime (t ),
MinFromTime (t ),
s , milli ))를 할당한다.
v 에 TimeClip (date )를 할당한다.
dateObject .[[DateValue]] 에 v 를 설정한다.
v 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 2 𝔽 이다.
참고
ms 가 없으면 이 메서드는 ms 가 getUTCMilliseconds() 값인 것처럼
동작한다.
21.4.4.35 Date.prototype.toDateString ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
tv 에 dateObject .[[DateValue]] 를 할당한다.
tv 가 NaN 이면 "Invalid
Date" 를 반환한다.
t 에 LocalTime (tv )를 할당한다.
DateString (t )를 반환한다.
21.4.4.36 Date.prototype.toISOString ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
tv 에 dateObject .[[DateValue]] 를 할당한다.
tv 가 NaN 이면 RangeError 예외를 던진다.
Assert :
tv 는 정수 Number 이다.
tv 가 날짜-시간 문자열 형식 에서 표현할 수 없는
연도에 해당하면 RangeError 예외를 던진다.
tv 를 날짜-시간 문자열 형식 의 UTC 시간대로 모든
형식 요소 및 UTC 오프셋 표기 "Z" 을 포함해 문자열로 반환한다.
21.4.4.37 Date.prototype.toJSON ( key )
이 메서드는 JSON.stringify (25.5.2 )에서 사용할 Date의 문자열 표현을 제공합니다.
호출 시 다음 단계를 수행합니다:
O 에 ? ToObject (this 값)을
할당한다.
tv 에 ? ToPrimitive (O ,
number )를 할당한다.
tv 가 Number 이고
tv 가 유한 이 아니면 null 을 반환한다.
? Invoke (O ,
"toISOString" )을 반환한다.
참고 1
참고 2
이 메서드는 의도적으로 generic입니다. this 값이 Date일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있습니다. 하지만 해당 객체에 toISOString 메서드가 있어야 합니다.
21.4.4.38 Date.prototype.toLocaleDateString ( [
reserved1 [ , reserved2 ] ] )
ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 해당 메서드는 ECMA-402 명세대로 구현되어야 합니다. ECMA-402 API를 포함하지
않는 구현의 경우 아래 명세를 따릅니다:
이 메서드는 문자열 값을 반환합니다. 문자열의 내용은 구현 정의 이지만, 현재 타임존의 Date의 "날짜" 부분을 호스트
환경의 현재 로케일 관습에 맞는 편리하고 사람이 읽기 쉬운 형태로 나타내는 것이 목적입니다.
이 메서드의 선택적 인수의 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 인수 위치에 다른 용도를 사용해서는 안
됩니다.
21.4.4.39 Date.prototype.toLocaleString ( [ reserved1
[ , reserved2 ] ] )
ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 해당 메서드는 ECMA-402 명세대로 구현되어야 합니다. ECMA-402 API를 포함하지
않는 구현의 경우 아래 명세를 따릅니다:
이 메서드는 문자열 값을 반환합니다. 문자열의 내용은 구현 정의 이지만, 현재 타임존의 Date를 호스트 환경의 현재 로케일
관습에 맞는 편리하고 사람이 읽기 쉬운 형태로 나타내는 것이 목적입니다.
이 메서드의 선택적 인수의 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 인수 위치에 다른 용도를 사용해서는 안
됩니다.
21.4.4.40 Date.prototype.toLocaleTimeString ( [
reserved1 [ , reserved2 ] ] )
ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 해당 메서드는 ECMA-402 명세대로 구현되어야 합니다. ECMA-402 API를 포함하지
않는 구현의 경우 아래 명세를 따릅니다:
이 메서드는 문자열 값을 반환합니다. 문자열의 내용은 구현 정의 이지만, 현재 타임존의 Date의 "시간" 부분을 호스트
환경의 현재 로케일 관습에 맞는 편리하고 사람이 읽기 쉬운 형태로 나타내는 것이 목적입니다.
이 메서드의 선택적 인수의 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 인수 위치에 다른 용도를 사용해서는 안
됩니다.
21.4.4.41 Date.prototype.toString ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
tv 에 dateObject .[[DateValue]] 를 할당한다.
ToDateString (tv )를 반환한다.
참고 1
어떤 Date d에 대해 d.[[DateValue]] 가
1000으로 나누어떨어지면, Date.parse(d.toString()) = d.valueOf()가
성립합니다. 21.4.3.2 참조.
참고 2
이 메서드는 generic이 아니므로 this 값이 Date가 아니면
TypeError 예외를 던집니다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 없습니다.
21.4.4.41.1 TimeString ( tv )
TimeString 추상 연산은 tv (Number, NaN 제외)를 인수로 받아 문자열을 반환합니다. 호출
시 다음 단계를 수행합니다:
hour 에 ToZeroPaddedDecimalString (ℝ (HourFromTime (tv )),
2)를 할당한다.
minute 에 ToZeroPaddedDecimalString (ℝ (MinFromTime (tv )), 2).
second 에 ToZeroPaddedDecimalString (ℝ (SecFromTime (tv )), 2).
hour , ":" , minute ,
":" , second , 코드 유닛 0x0020(SPACE),
"GMT" 을 string-concatenation 으로 반환한다.
21.4.4.41.2 DateString ( tv )
DateString 추상 연산은 tv (Number, NaN 제외)를 인수로 받아 문자열을 반환합니다. 호출
시 다음 단계를 수행합니다:
weekday 에 표 65 에서
WeekDay (tv )에 해당하는 Name을
할당한다.
month 에 표 66 에서
MonthFromTime (tv )에
해당하는 Name을 할당한다.
day 에 ToZeroPaddedDecimalString (ℝ (DateFromTime (tv )),
2)를 할당한다.
yv 에 YearFromTime (tv )를
할당한다.
yv 가 +0 𝔽 이거나 yv >
+0 𝔽 이면 yearSign 을 빈 문자열로, 아니면
yearSign 을 "-" 로 설정한다.
paddedYear 에 ToZeroPaddedDecimalString (abs (ℝ (yv )), 4)를
할당한다.
weekday , 코드 유닛 0x0020(SPACE), month , 코드 유닛 0x0020(SPACE),
day , 코드 유닛 0x0020(SPACE), yearSign , paddedYear 를
string-concatenation 으로 반환한다.
표 65: 요일 이름
숫자
이름
+0 𝔽
"Sun"
1 𝔽
"Mon"
2 𝔽
"Tue"
3 𝔽
"Wed"
4 𝔽
"Thu"
5 𝔽
"Fri"
6 𝔽
"Sat"
표 66: 월 이름
숫자
이름
+0 𝔽
"Jan"
1 𝔽
"Feb"
2 𝔽
"Mar"
3 𝔽
"Apr"
4 𝔽
"May"
5 𝔽
"Jun"
6 𝔽
"Jul"
7 𝔽
"Aug"
8 𝔽
"Sep"
9 𝔽
"Oct"
10 𝔽
"Nov"
11 𝔽
"Dec"
21.4.4.41.3 TimeZoneString ( tv )
TimeZoneString 추상 연산은 tv (정수 Number )를 인수로 받아 문자열을 반환합니다. 호출 시 다음
단계를 수행합니다:
systemTimeZoneIdentifier 에 SystemTimeZoneIdentifier ()를
할당한다.
IsTimeZoneOffsetString (systemTimeZoneIdentifier )
가 true 이면,
offsetNs 에 ParseTimeZoneOffsetString (systemTimeZoneIdentifier )를
할당한다.
그 외,
offsetNs 에 GetNamedTimeZoneOffsetNanoseconds (systemTimeZoneIdentifier ,
ℤ (ℝ (tv ) × 106 ))를
할당한다.
offset 에 𝔽 (truncate (offsetNs /
106 ))를 할당한다.
offset 이 +0 𝔽 이거나 offset >
+0 𝔽 이면,
offsetSign 에 "+" 를 할당한다.
absOffset 에 offset 을 할당한다.
그 외,
offsetSign 에 "-" 를 할당한다.
absOffset 에 -offset 을 할당한다.
offsetMin 에 ToZeroPaddedDecimalString (ℝ (MinFromTime (absOffset )),
2)를 할당한다.
offsetHour 에 ToZeroPaddedDecimalString (ℝ (HourFromTime (absOffset )),
2)를 할당한다.
tzName 에 빈 문자열 또는 코드 유닛 0x0020(SPACE), 코드 유닛 0x0028(LEFT PAREN),
구현 정의 타임존 이름, 코드 유닛
0x0029(RIGHT PAREN)를 string-concatenation 으로 연결한
문자열 중 하나를 할당한다.
offsetSign , offsetHour , offsetMin ,
tzName 를 string-concatenation 으로 반환한다.
21.4.4.41.4 ToDateString ( tv )
ToDateString 추상 연산은 tv (정수 Number 또는 NaN )를 인수로
받아 문자열을 반환합니다. 호출 시 다음 단계를 수행합니다:
tv 가 NaN 이면 "Invalid
Date" 를 반환한다.
t 에 LocalTime (tv )를 할당한다.
DateString (t ), 코드 유닛
0x0020(SPACE), TimeString (t ),
TimeZoneString (tv )를
string-concatenation 으로 반환한다.
21.4.4.42 Date.prototype.toTimeString ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
tv 에 dateObject .[[DateValue]] 를 할당한다.
tv 가 NaN 이면 "Invalid
Date" 를 반환한다.
t 에 LocalTime (tv )를 할당한다.
TimeString (t )과 TimeZoneString (tv )를
string-concatenation 으로 반환한다.
21.4.4.43 Date.prototype.toUTCString ( )
이 메서드는 this 값에 해당하는 시점을 나타내는 문자열 값을 반환합니다. 문자열 형식은 RFC 7231의 "HTTP-date"를
기반으로 하며, ECMAScript Date가 지원하는 전체 시간 범위를 일반화하여 지원합니다.
호출 시 다음 단계를 수행합니다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
tv 에 dateObject .[[DateValue]] 를 할당한다.
tv 가 NaN 이면 "Invalid
Date" 를 반환한다.
weekday 에 표 65 에서 WeekDay (tv )에 해당하는 이름을 할당한다.
month 에 표 66 에서 MonthFromTime (tv )에 해당하는
이름을 할당한다.
day 에 ToZeroPaddedDecimalString (ℝ (DateFromTime (tv )), 2)를
할당한다.
yv 에 YearFromTime (tv )를 할당한다.
yv 가 +0 𝔽 이거나 yv >
+0 𝔽 이면 yearSign 을 빈 문자열로, 아니면
yearSign 을 "-" 로 설정한다.
paddedYear 에 ToZeroPaddedDecimalString (abs (ℝ (yv )), 4)를
할당한다.
weekday , "," , 코드 유닛 0x0020(SPACE),
day , 코드 유닛 0x0020(SPACE), month , 코드 유닛 0x0020(SPACE),
yearSign , paddedYear , 코드 유닛 0x0020(SPACE), TimeString (tv )를 string-concatenation 으로 반환한다.
21.4.4.44 Date.prototype.valueOf ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
dateObject .[[DateValue]] 를 반환한다.
21.4.4.45 Date.prototype [ %Symbol.toPrimitive% ] (
hint )
이 메서드는 ECMAScript 언어 연산자가 Date를 원시값으로 변환할 때 호출됩니다. hint 의 허용 값은
"default" , "number" , "string" 입니다.
Date는 내장 ECMAScript 객체 중 유일하게 "default" 를 "string" 과
동등하게 취급합니다. 다른 내장 ECMAScript 객체는 "default" 를 "number" 과
동등하게 취급합니다.
호출 시 다음 단계를 수행합니다:
O 에 this 값을 할당한다.
O 가 객체가 아니면 , TypeError
예외를 던진다.
hint 가 "string" 또는 "default" 이면,
tryFirst 에 string 을 할당한다.
그 외 hint 가 "number" 이면,
tryFirst 에 number 를 할당한다.
그 외,
TypeError 예외를 던진다.
? OrdinaryToPrimitive (O ,
tryFirst )를 반환한다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }이다.
이 메서드의 "name" 프로퍼티 값은
"[Symbol.toPrimitive]" 이다.
21.4.5 Date 인스턴스의 프로퍼티
Date 인스턴스는 일반
객체 이며, Date 프로토타입
객체 로부터 프로퍼티를 상속받습니다. Date 인스턴스는 또한 [[DateValue]]
내부 슬롯을 가집니다. [[DateValue]] 내부 슬롯은 이 Date가 나타내는 시간 값 입니다.
22 텍스트 처리
22.1 문자열 객체
22.1.1 String 생성자
String 생성자 :
%String% 이다.
"String" 프로퍼티의 초기값이며, 글로벌 객체 에 존재한다.
생성자 로 호출
시 새로운 문자열 객체를 생성 및 초기화한다.
생성자 가 아닌
함수로 호출 시, 타입 변환을 수행한다.
클래스 정의의 extends 절 값으로 사용될 수 있다. String 동작을 상속하려는 서브클래스 생성자 는 [[StringData]] 내부 슬롯으로 하위 클래스 인스턴스를 생성 및 초기화하기 위해 반드시 String
생성자 에 대한
super 호출을 포함해야 한다.
22.1.1.1 String ( value )
이 함수는 호출 시 다음 단계를 수행한다:
value 가 없으면,
s 에 빈 문자열을 할당한다.
그 외,
NewTarget이 undefined 이고 value 가 Symbol 이면,
SymbolDescriptiveString (value )를
반환한다.
s 에 ? ToString (value )를 할당한다.
NewTarget이 undefined 이면 s 를 반환한다.
StringCreate (s ,
? GetPrototypeFromConstructor (NewTarget,
"%String.prototype%" ))를 반환한다.
22.1.2 String 생성자의 프로퍼티
String 생성자 :
22.1.2.1 String.fromCharCode ( ...codeUnits )
이 함수는 임의 개수의 인수(codeUnits rest parameter)를 받아 호출될 수 있다.
호출 시 다음 단계를 수행한다:
result 에 빈 문자열을 할당한다.
codeUnits 의 각 요소 next 에 대해,
nextCU 에 next 를 ? ToUint16 로 변환한 후 ℝ 로 변환한 코드 유닛 값을
할당한다.
result 에 result 와 nextCU 를 문자열 연결 한 결과를 재할당한다.
result 를 반환한다.
이 함수의 "length" 프로퍼티 값은
1 𝔽 이다.
22.1.2.2 String.fromCodePoint ( ...codePoints )
이 함수는 임의 개수의 인수(codePoints rest parameter)를 받아 호출될 수 있다.
호출 시 다음 단계를 수행한다:
result 에 빈 문자열을 할당한다.
codePoints 의 각 요소 next 에 대해,
nextCP 에 ? ToNumber (next )를 할당한다.
nextCP 가 정수 Number 가 아니면
RangeError 예외를 던진다.
ℝ (nextCP ) < 0 또는 ℝ (nextCP ) > 0x10FFFF이면
RangeError 예외를 던진다.
result 에 result 와 UTF16EncodeCodePoint (ℝ (nextCP ))를 문자열 연결 하여 재할당한다.
Assert :
codePoints 가 비어 있으면 result 는 빈 문자열이다.
result 를 반환한다.
이 함수의 "length" 프로퍼티 값은
1 𝔽 이다.
22.1.2.3 String.prototype
String.prototype의 초기값은 String 프로토타입
객체 이다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }이다.
22.1.2.4 String.raw ( template ,
...substitutions )
이 함수는 가변 개수의 인수를 받는다. 첫 번째 인수는 template , 나머지는 List
substitutions 이다.
호출 시 다음 단계를 수행한다:
substitutionCount 에 substitutions 의 요소 개수를 할당한다.
cooked 에 ? ToObject (template )를 할당한다.
literals 에 ? ToObject (? Get (cooked ,
"raw" ))를 할당한다.
literalCount 에 ? LengthOfArrayLike (literals )를
할당한다.
literalCount ≤ 0이면 빈 문자열을 반환한다.
R 에 빈 문자열을 할당한다.
nextIndex 에 0을 할당한다.
반복,
nextLiteralVal 에 ? Get (literals ,
! ToString (𝔽 (nextIndex )))를
할당한다.
nextLiteral 에 ? ToString (nextLiteralVal )를
할당한다.
R 에 R 과 nextLiteral 를 문자열 연결 한 결과를 재할당한다.
nextIndex + 1 = literalCount 이면 R 를 반환한다.
nextIndex < substitutionCount 이면,
nextSubVal 에
substitutions [nextIndex ]를 할당한다.
nextSub 에 ? ToString (nextSubVal )를
할당한다.
R 에 R 과 nextSub 를 문자열 연결 한 결과를
재할당한다.
nextIndex 에 nextIndex + 1을 할당한다.
참고
이 함수는 Tagged Template (13.3.11 )의 태그 함수로 사용하기 위해
설계되었습니다. 그렇게 호출될 때 첫 번째 인수는 올바른 템플릿 객체이며 나머지 rest parameter는 치환값을 포함하게 됩니다.
22.1.3 String 프로토타입 객체의 프로퍼티
String 프로토타입 객체 :
%String.prototype% 이다.
문자열
익조틱
객체 이며 해당 객체에 대해 지정된 내부 메서드를 가진다.
[[StringData]] 내부 슬롯을 가지며, 그 값은 빈 문자열이다.
"length" 프로퍼티를 가지며 초기값은 +0 𝔽 이고, 속성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }이다.
[[Prototype]] 내부 슬롯을 가지며, 그 값은 %Object.prototype% 이다.
별도로 명시되지 않는 한, 아래에 정의된 String 프로토타입 객체의 메서드는 generic이 아니며, 이들에 전달되는 this 값은
반드시 문자열 값이거나 [[StringData]] 내부 슬롯이 문자열 값으로 초기화된 객체여야 한다.
22.1.3.1 String.prototype.at ( index )
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
len 에 S 의 길이를 할당한다.
relativeIndex 에 ? ToIntegerOrInfinity (index )를
할당한다.
relativeIndex ≥ 0이면,
k 에 relativeIndex 를 할당한다.
그 외,
k 에 len + relativeIndex 를 할당한다.
k < 0 또는 k ≥ len 이면 undefined 를
반환한다.
S 의 k 부터 k + 1까지의 부분 문자열 을 반환한다.
22.1.3.2 String.prototype.charAt ( pos )
참고 1
이 메서드는 이 객체를 문자열로 변환한 값에서 pos 인덱스에 위치한 코드 유닛을 포함하는 단일 요소 문자열을 반환한다. 해당
인덱스에 요소가 없으면 결과는 빈 문자열이다. 결과는 문자열 값이며,
문자열 객체가 아니다.
pos가 정수 Number 이면,
x.charAt(pos)의 결과는 x.substring(pos, pos + 1)의 결과와 같다.
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
position 에 ? ToIntegerOrInfinity (pos )를
할당한다.
size 에 S 의 길이를 할당한다.
position < 0 또는 position ≥ size 이면 빈 문자열을 반환한다.
S 의 position 부터 position + 1까지의 부분 문자열 을
반환한다.
참고 2
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.3 String.prototype.charCodeAt ( pos )
참고 1
이 메서드는 이 객체를 문자열로 변환한 값에서 pos 인덱스에 위치한 코드 유닛의 숫자 값을 나타내는 Number(음이 아닌
정수
Number 이며 216 미만)를 반환한다. 해당 인덱스에 요소가 없으면 결과는
NaN 이다.
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
position 에 ? ToIntegerOrInfinity (pos )를
할당한다.
size 에 S 의 길이를 할당한다.
position < 0 또는 position ≥ size 이면
NaN 을 반환한다.
S 의 position 인덱스 코드 유닛의 숫자 값을 Number
값 으로 반환한다.
참고 2
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.4 String.prototype.codePointAt ( pos )
참고 1
이 메서드는 이 객체를 문자열로 변환한 값에서 pos 인덱스에서 시작하는 UTF-16 인코딩 코드 포인트(6.1.4 )의 숫자
값을 나타내는 음이 아닌 정수
Number (0x10FFFF 𝔽 이하)를 반환한다. 해당
인덱스에 요소가 없으면 결과는 undefined 이다. 유효한 UTF-16 서로게이트
페어 가 pos 에서 시작하지 않으면, 결과는 pos 의 코드 유닛이다.
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
position 에 ? ToIntegerOrInfinity (pos )를
할당한다.
size 에 S 의 길이를 할당한다.
position < 0 또는 position ≥ size 이면
undefined 를 반환한다.
cp 에 CodePointAt (S ,
position )을 할당한다.
cp .[[CodePoint]] 를 𝔽 로 변환하여 반환한다.
참고 2
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.5 String.prototype.concat ( ...args )
참고 1
이 메서드를 호출하면 this 값을(문자열로 변환) 시작으로 각 인수를 문자열로 변환한 코드 유닛이 뒤따르는 문자열
값을 반환한다. 결과는 문자열 값이며,
문자열 객체가 아니다.
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
R 에 S 를 할당한다.
args 의 각 요소 next 에 대해,
nextString 에 ? ToString (next )를 할당한다.
R 에 R 과 nextString 을 문자열 연결 한 결과를 재할당한다.
R 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 1 𝔽 이다.
참고 2
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.6 String.prototype.constructor
String.prototype.constructor의 초기값은 %String% 이다.
22.1.3.7 String.prototype.endsWith ( searchString [ ,
endPosition ] )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
isRegExp 에 ? IsRegExp (searchString )를 할당한다.
isRegExp 가 true 이면 TypeError 예외를 던진다.
searchStr 에 ? ToString (searchString )를 할당한다.
len 에 S 의 길이를 할당한다.
endPosition 이 undefined 이면 pos 에
len 을, 아니면 pos 에 ? ToIntegerOrInfinity (endPosition )을
할당한다.
end 에 0과
len 사이로 clamping 한 pos 를 할당한다.
searchLength 에 searchStr 의 길이를 할당한다.
searchLength = 0이면 true 를 반환한다.
start 에 end - searchLength 를 할당한다.
start < 0이면 false 를 반환한다.
substring 에 S 의 start 부터 end 까지의 부분 문자열 을
할당한다.
substring 이 searchStr 이면 true 를 반환한다.
false 를 반환한다.
참고 1
이 메서드는 searchString 을 문자열로 변환한 코드 유닛 시퀀스가, 이 객체(문자열로 변환)의
endPosition - length(this)에서 시작하는 코드 유닛과 동일하면 true 를
반환한다. 그렇지 않으면 false 를 반환한다.
참고 2
첫 번째 인수가 RegExp인 경우 예외를 던지는 것은, 향후 버전에서 그러한 인수 값을 허용하는 확장을 정의할 수 있도록 하기 위함이다.
참고 3
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.8 String.prototype.includes ( searchString [ ,
position ] )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
isRegExp 에 ? IsRegExp (searchString )를 할당한다.
isRegExp 가 true 이면 TypeError 예외를 던진다.
searchStr 에 ? ToString (searchString )를 할당한다.
pos 에 ? ToIntegerOrInfinity (position )를
할당한다.
Assert :
position 이 undefined 이면 pos 는 0이다.
len 에 S 의 길이를 할당한다.
start 에 0과
len 사이로 clamping 한 pos 를 할당한다.
index 에 StringIndexOf (S ,
searchStr , start )를 할당한다.
index 가 not-found 이면 false 를 반환한다.
true 를 반환한다.
참고 1
searchString 이 이 객체를 문자열로 변환한 결과에서 position 이상의 인덱스에서
부분 문자열 로 나타나면 true 를 반환하고, 그렇지 않으면
false 를 반환한다. position 이 undefined 이면
0으로 간주되어 전체 문자열을 검색한다.
참고 2
첫 번째 인수가 RegExp인 경우 예외를 던지는 것은, 향후 버전에서 그러한 인수 값을 허용하는 확장을 정의할 수 있도록 하기 위함이다.
참고 3
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.9 String.prototype.indexOf ( searchString [ ,
position ] )
참고 1
searchString 이 이 객체를 문자열로 변환한 결과에서 position 이상의 인덱스에서
부분 문자열 로 나타나면, 가장 작은 해당 인덱스를 반환하고, 그렇지 않으면
-1 𝔽 를 반환한다. position 이
undefined 이면 +0 𝔽 으로 간주되어 전체 문자열을
검색한다.
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
searchStr 에 ? ToString (searchString )를 할당한다.
pos 에 ? ToIntegerOrInfinity (position )를
할당한다.
Assert :
position 이 undefined 이면 pos 는 0이다.
len 에 S 의 길이를 할당한다.
start 에 0과
len 사이로 clamping 한 pos 를 할당한다.
result 에 StringIndexOf (S ,
searchStr , start )를 할당한다.
result 가 not-found 이면
-1 𝔽 를 반환한다.
𝔽 (result )를 반환한다.
참고 2
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.10 String.prototype.isWellFormed ( )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
IsStringWellFormedUnicode (S )를
반환한다.
22.1.3.11 String.prototype.lastIndexOf ( searchString
[ , position ] )
참고 1
searchString 이 이 객체를 문자열로 변환한 결과에서 position 이하의 인덱스에서
부분 문자열 로 나타나면, 가장 큰 해당 인덱스를 반환하고, 그렇지 않으면
-1 𝔽 를 반환한다. position 이
undefined 이면 문자열 값의 길이로 간주되어 전체 문자열을 검색한다.
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
searchStr 에 ? ToString (searchString )를 할당한다.
numPos 에 ? ToNumber (position )를 할당한다.
Assert :
position 이 undefined 이면 numPos 는
NaN 이다.
numPos 가 NaN 이면 pos 에 +∞를, 아니면 pos 에
! ToIntegerOrInfinity (numPos )를
할당한다.
len 에 S 의 길이를 할당한다.
searchLen 에 searchStr 의 길이를 할당한다.
start 에 0과
len - searchLen 사이로 clamping 한
pos 를 할당한다.
result 에 StringLastIndexOf (S ,
searchStr , start )를 할당한다.
result 가 not-found 이면
-1 𝔽 를 반환한다.
𝔽 (result )를 반환한다.
참고 2
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.12 String.prototype.localeCompare ( that [ ,
reserved1 [ , reserved2 ] ] )
ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 해당 메서드는 ECMA-402 명세대로 구현되어야 한다. ECMA-402 API를 포함하지
않는 구현의 경우 아래 명세를 따릅니다:
이 메서드는 NaN 이 아닌 Number를 반환하며, this 값을(문자열 S 로
변환) that 과(문자열 thatValue 로 변환) 구현 정의 로케일 민감한 문자열 비교
결과를 나타낸다. 결과는 정렬
순서 에 따라 S 가 thatValue 앞에 있으면 음수, 뒤에 있으면 양수, 그 외의
경우(상대적 순서가 없는 경우) 0이 된다.
비교 전, 이 메서드는 문자열을 준비하기 위해 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
thatValue 에 ? ToString (that )를 할당한다.
이 메서드의 두 번째, 세 번째 선택적 인수의 의미는 ECMA-402 명세에 정의되어 있다. ECMA-402를 지원하지 않는 구현은 해당 인수 위치에 다른 용도를
할당해서는 안 된다.
실제 반환 값은 구현 정의 로, 추가 정보를 인코딩할 수 있도록 허용되지만, 이
메서드는 두 인수에 대해 일관된 비교자 로서 모든 문자열 집합에 대해 전체 순서를 정의해야 한다.
또한, 이 메서드는 유니코드 표준에 따라 정규 동등성을 인식하고 존중해야 하며, 구분 가능한 문자열이 정규 동등할 경우 비교 결과는
+0 𝔽 이어야 한다.
참고 1
이 메서드는 Array.prototype.sort의 인수로 직접 적합하지 않다. 후자는 두 인수의 함수가 필요하기 때문이다.
참고 2
이 메서드는 ECMAScript 환경에서 호스트 환경 에서 제공하는 언어나 로케일 민감 비교 기능에 의존할
수 있으며, 호스트 환경의 현재 로케일 관습에 따라 비교하도록 설계되었다. 그러나 비교 기능과 상관없이 이 메서드는 반드시 유니코드 표준의 정규
동등성을 인식하고 존중해야 한다. 예를 들어, 다음 비교는 모두 +0 𝔽 을 반환해야 한다:
"\u212B" .localeCompare ("A\u030A" )
"\u2126" .localeCompare ("\u03A9" )
"\u1E69" .localeCompare ("s\u0307\u0323" )
"\u1E0B\u0323" .localeCompare ("\u1E0D\u0307" )
"\u1100\u1161" .localeCompare ("\uAC00" )
정규 동등성의 정의와 논의는 유니코드 표준 2, 3장, Unicode
Standard Annex #15, Unicode Normalization Forms , Unicode Technical Note #5, Canonical
Equivalence in Applications , Unicode Technical Standard #10, Unicode
Collation Algorithm 를 참조.
이 메서드는 유니코드 호환 동등성 또는 호환 분해(유니코드 표준 3장 3.7절 참조)는
존중하지 않는 것이 권장된다.
참고 3
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.13 String.prototype.match ( regexp )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
regexp 가 undefined 또는 null 이 아니면,
matcher 에 ? GetMethod (regexp ,
%Symbol.match% )를 할당한다.
matcher 가 undefined 가 아니면,
? Call (matcher ,
regexp , « O »)를 반환한다.
S 에 ? ToString (O )를 할당한다.
rx 에 ? RegExpCreate (regexp ,
undefined )를 할당한다.
? Invoke (rx , %Symbol.match% , «
S »)를 반환한다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.14 String.prototype.matchAll ( regexp )
이 메서드는 this 값을 나타내는 문자열에 대해 regexp 로 정규표현식 매칭을 수행하고, 매칭 결과를 산출하는
이터레이터 를 반환한다. 각 매칭 결과는 문자열에서 매칭된 부분을 첫
번째 요소로 하고, 이후에는 캡처 그룹에 매칭된 부분이 순서대로 들어있는 배열이다. 정규표현식이 한 번도 매칭되지 않으면, 반환된 이터레이터 는 아무 매칭 결과도 산출하지 않는다.
호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
regexp 가 undefined 또는 null 이 아니면,
isRegExp 에 ? IsRegExp (regexp )를
할당한다.
isRegExp 가 true 이면,
flags 에 ? Get (regexp ,
"flags" )를 할당한다.
? RequireObjectCoercible (flags )를
수행한다.
? ToString (flags )에
"g" 가 포함되어 있지 않으면 TypeError 예외를
던진다.
matcher 에 ? GetMethod (regexp ,
%Symbol.matchAll% )를
할당한다.
matcher 가 undefined 가 아니면,
? Call (matcher ,
regexp , « O »)를 반환한다.
S 에 ? ToString (O )를 할당한다.
rx 에 ? RegExpCreate (regexp ,
"g" )를 할당한다.
? Invoke (rx , %Symbol.matchAll% , «
S »)를 반환한다.
참고 1
이 메서드는 의도적으로 generic이므로 this 값이 반드시 문자열 객체일
필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.
참고 2
String.prototype.split과 유사하게
String.prototype.matchAll은 일반적으로 입력값을 변형하지 않도록 설계되었다.
22.1.3.15 String.prototype.normalize ( [ form ] )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
form 이 undefined 이면 f 에
"NFC" 를 할당한다.
그 외에는 f 에 ? ToString (form )을 할당한다.
f 가 "NFC" , "NFD" ,
"NFKC" , "NFKD" 중 하나가 아니면
RangeError 예외를 던진다.
ns 에 최신 유니코드
표준, Normalization Forms 에 명시된 대로 S 를 f 가 지정하는 정규화 형식으로
정규화한 결과 문자열 값을 할당한다.
ns 를 반환한다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.16 String.prototype.padEnd ( maxLength [ ,
fillString ] )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
? StringPaddingBuiltinsImpl (O ,
maxLength , fillString , end )를 반환한다.
22.1.3.17 String.prototype.padStart ( maxLength [ ,
fillString ] )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
? StringPaddingBuiltinsImpl (O ,
maxLength , fillString , start )를 반환한다.
22.1.3.17.1 StringPaddingBuiltinsImpl ( O ,
maxLength , fillString , placement )
StringPaddingBuiltinsImpl 추상 연산은 O (ECMAScript 언어 값 ),
maxLength (ECMAScript 언어 값 ),
fillString (ECMAScript 언어 값 ),
placement (start 또는 end )를 인수로 받고
정상 완료 (문자열 포함)
또는 throw 완료 를 반환한다.
호출 시 다음 단계를 수행한다:
S 에 ? ToString (O )를 할당한다.
intMaxLength 에 ℝ (? ToLength (maxLength ))를
할당한다.
stringLength 에 S 의 길이를 할당한다.
intMaxLength ≤ stringLength 이면 S 를 반환한다.
fillString 이 undefined 이면 fillString 을 코드
유닛 0x0020(SPACE)만으로 구성된 문자열 값으로 설정한다.
그 외에는 fillString 을 ? ToString (fillString )으로
설정한다.
StringPad (S ,
intMaxLength , fillString , placement )를 반환한다.
22.1.3.17.2 StringPad ( S , maxLength ,
fillString , placement )
StringPad 추상 연산은 S (문자열), maxLength (음이 아닌 정수 ), fillString (문자열),
placement (start 또는 end )를 인수로 받고
문자열을 반환한다. 호출 시 다음 단계를 수행한다:
stringLength 에 S 의 길이를 할당한다.
maxLength ≤ stringLength 이면 S 를 반환한다.
fillString 이 빈 문자열이면 S 를 반환한다.
fillLen 에 maxLength - stringLength 를 할당한다.
truncatedStringFiller 에 fillString 을 반복 연결한 후
fillLen 길이로 잘라낸 문자열 값을 할당한다.
placement 가 start 이면
truncatedStringFiller 와 S 를 문자열 연결 하여 반환한다.
그 외에는 S 와 truncatedStringFiller 를 문자열 연결 하여 반환한다.
참고 1
maxLength 인수는 S 의 길이보다 작아질 수 없도록 clamping된다.
참고 2
fillString 인수의 기본값은 " " (코드 유닛 0x0020 SPACE만으로 구성된
문자열)이다.
22.1.3.17.3 ToZeroPaddedDecimalString ( n ,
minLength )
ToZeroPaddedDecimalString 추상 연산은 n (음이 아닌 정수 ), minLength (음이 아닌
정수 )를 인수로 받고
문자열을 반환한다. 호출 시 다음 단계를 수행한다:
S 에 n 의 십진수 문자열 표현을 할당한다.
StringPad (S ,
minLength , "0" , start )를
반환한다.
22.1.3.18 String.prototype.repeat ( count )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
n 에 ? ToIntegerOrInfinity (count )를
할당한다.
n < 0 또는 n = +∞이면 RangeError 예외를 던진다.
n = 0이면 빈 문자열을 반환한다.
S 를 n 번 이어붙인 문자열 값을 반환한다.
참고 1
이 메서드는 this 값을(문자열로 변환) count 번 반복한 코드 유닛으로 구성된 문자열 값을
생성한다.
참고 2
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.19 String.prototype.replace ( searchValue ,
replaceValue )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
searchValue 가 undefined 또는 null 이
아니면,
replacer 에 ? GetMethod (searchValue ,
%Symbol.replace% )를
할당한다.
replacer 가 undefined 가 아니면,
? Call (replacer ,
searchValue , « O ,
replaceValue »)를 반환한다.
string 에 ? ToString (O )를 할당한다.
searchString 에 ? ToString (searchValue )를 할당한다.
functionalReplace 에 IsCallable (replaceValue )를
할당한다.
functionalReplace 가 false 이면,
replaceValue 를 ? ToString (replaceValue )로
재설정한다.
searchLength 에 searchString 의 길이를 할당한다.
position 에 StringIndexOf (string ,
searchString , 0)을 할당한다.
position 이 not-found 이면 string 을 반환한다.
preceding 에 string 의 0부터 position 까지의 부분 문자열 을
할당한다.
following 에 string 의 position +
searchLength 부터 끝까지의 부분 문자열 을 할당한다.
functionalReplace 가 true 이면,
replacement 에 ? ToString (?
Call (replaceValue ,
undefined , « searchString , 𝔽 (position ),
string »))를 할당한다.
그 외에는,
Assert : replaceValue
는
문자열 이다.
captures 에 새 빈 List 를
할당한다.
replacement 에 ! GetSubstitution (searchString ,
string , position , captures ,
undefined , replaceValue )를 할당한다.
preceding , replacement , following 을 문자열
연결 하여 반환한다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.19.1 GetSubstitution ( matched ,
str , position , captures , namedCaptures ,
replacementTemplate )
GetSubstitution 추상 연산은 matched (문자열), str (문자열),
position (음이 아닌 정수 ), captures (문자열 또는
undefined 의 List ),
namedCaptures (객체 또는 undefined ),
replacementTemplate (문자열)을 인수로 받고 정상 완료 (문자열 포함)
또는 throw 완료 를 반환한다.
이 추상 연산에서 십진수 숫자 는 포함 구간 0x0030(DIGIT ZERO)부터
0x0039(DIGIT NINE)까지의 코드 유닛이다. 호출 시 다음 단계를 수행한다:
stringLength 에 str 의 길이를 할당한다.
Assert : position ≤
stringLength .
result 에 빈 문자열을 할당한다.
templateRemainder 에 replacementTemplate 를 할당한다.
templateRemainder 가 빈 문자열이 아닌 동안 반복,
NOTE: 아래 단계는
ref (templateRemainder 의 접두사)를 추출하고,
refReplacement (치환값)를 결정한 후 그 치환값을 result 에 추가한다.
templateRemainder 가 "$$" 로 시작하면,
ref 에 "$$" 를 할당한다.
refReplacement 에 "$" 를 할당한다.
그 외 templateRemainder 가 "$`" 로 시작하면,
ref 에 "$`" 를 할당한다.
refReplacement 에 str 의 0부터
position 까지의 부분 문자열 을
할당한다.
그 외 templateRemainder 가 "$&" 로 시작하면,
ref 에 "$&" 를 할당한다.
refReplacement 에 matched 를 할당한다.
그 외 templateRemainder 가 "$'" (0x0024(DOLLAR
SIGN) + 0x0027(APOSTROPHE))로 시작하면,
ref 에 "$'" 를 할당한다.
matchLength 에 matched 의 길이를 할당한다.
tailPos 에 position +
matchLength 를 할당한다.
refReplacement 에 str 의 min (tailPos ,
stringLength )부터 끝까지의 부분 문자열 을
할당한다.
NOTE: tailPos 가 stringLength 를 초과할 수 있는 경우는
intrinsic %Symbol.replace%
메서드가 %RegExp.prototype% 의
intrinsic %RegExp.prototype.exec%가 아닌 "exec" 프로퍼티를 가진 객체에 대해 호출된
경우이다.
그 외 templateRemainder 가 "$" + 1개 이상의 십진수
숫자로 시작하면,
templateRemainder 가 "$" + 2개 이상의
십진수 숫자로 시작하면 digitCount 에 2를, 아니면 1을 할당한다.
digits 에 templateRemainder 의 1부터 1 +
digitCount 까지의 부분 문자열 을
할당한다.
index 에 ℝ (StringToNumber (digits ))를
할당한다.
Assert : 0 ≤
index ≤ 99.
captureLen 에 captures 요소 개수를 할당한다.
index > captureLen 이고
digitCount = 2이면,
NOTE: 두 자리 치환 패턴이 캡처 그룹 개수를 초과하는 인덱스를 지정하면, 한 자리 치환 패턴 +
리터럴 숫자로 처리한다.
digitCount 를 1로 재설정한다.
digits 를 digits 의 0부터 1까지의 부분 문자열 로 재설정한다.
index 를 ℝ (StringToNumber (digits ))로
재설정한다.
ref 에 templateRemainder 의 0부터 1 +
digitCount 까지의 부분 문자열 을
할당한다.
1 ≤ index ≤ captureLen 이면,
capture 에 captures [index
- 1]을 할당한다.
capture 가 undefined 이면,
refReplacement 에 빈 문자열을 할당한다.
그 외에는,
refReplacement 에 capture 를
할당한다.
그 외에는,
refReplacement 에 ref 를 할당한다.
그 외 templateRemainder 가 "$<" 로 시작하면,
gtPos 에 StringIndexOf (templateRemainder ,
">" , 0)을 할당한다.
gtPos 가 not-found 이거나
namedCaptures 가 undefined 이면,
ref 에 "$<" 를 할당한다.
refReplacement 에 ref 를 할당한다.
그 외에는,
ref 에 templateRemainder 의 0부터
gtPos + 1까지의 부분
문자열 을 할당한다.
groupName 에 templateRemainder 의 2부터
gtPos 까지의 부분
문자열 을 할당한다.
Assert :
namedCaptures 는 객체 이다.
capture 에 ? Get (namedCaptures ,
groupName )을 할당한다.
capture 가 undefined 이면,
refReplacement 에 빈 문자열을 할당한다.
그 외에는,
refReplacement 에 ? ToString (capture )를
할당한다.
그 외에는,
ref 에 templateRemainder 의 0부터 1까지의 부분
문자열 을 할당한다.
refReplacement 에 ref 를 할당한다.
refLength 에 ref 의 길이를 할당한다.
templateRemainder 를 templateRemainder 의
refLength 부터 끝까지의 부분 문자열 로 재설정한다.
result 에 result 와 refReplacement 를
문자열 연결 한 결과를 할당한다.
result 를 반환한다.
22.1.3.20 String.prototype.replaceAll ( searchValue ,
replaceValue )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
searchValue 가 undefined 또는 null 이
아니면,
isRegExp 에 ? IsRegExp (searchValue )를
할당한다.
isRegExp 가 true 이면,
flags 에 ? Get (searchValue ,
"flags" )를 할당한다.
? RequireObjectCoercible (flags )를
수행한다.
? ToString (flags )에
"g" 가 포함되어 있지 않으면 TypeError 예외를
던진다.
replacer 에 ? GetMethod (searchValue ,
%Symbol.replace% )를
할당한다.
replacer 가 undefined 가 아니면,
? Call (replacer ,
searchValue , « O ,
replaceValue »)를 반환한다.
string 에 ? ToString (O )를 할당한다.
searchString 에 ? ToString (searchValue )를 할당한다.
functionalReplace 에 IsCallable (replaceValue )를
할당한다.
functionalReplace 가 false 이면,
replaceValue 를 ? ToString (replaceValue )로
재설정한다.
searchLength 에 searchString 의 길이를 할당한다.
advanceBy 에 max (1, searchLength )를 할당한다.
matchPositions 에 새 빈 List 를 할당한다.
position 에 StringIndexOf (string ,
searchString , 0)를 할당한다.
position 이 not-found 가 아닌 동안 반복,
matchPositions 에 position 을 추가한다.
position 을 StringIndexOf (string ,
searchString , position + advanceBy )로 재설정한다.
endOfLastMatch 에 0을 할당한다.
result 에 빈 문자열을 할당한다.
matchPositions 의 각 요소 p 에 대해,
preserved 에 string 의 endOfLastMatch 부터
p 까지의 부분 문자열 을 할당한다.
functionalReplace 가 true 이면,
replacement 에 ? ToString (? Call (replaceValue ,
undefined , « searchString , 𝔽 (p ),
string »))를 할당한다.
그 외에는,
Assert :
replaceValue 는
문자열 이다.
captures 에 새 빈 List 를
할당한다.
replacement 에 ! GetSubstitution (searchString ,
string , p , captures ,
undefined , replaceValue )를 할당한다.
result 에 result , preserved ,
replacement 를 문자열 연결 한
결과로 재설정한다.
endOfLastMatch 를 p + searchLength 로 재설정한다.
endOfLastMatch 가 string 의 길이보다 작으면,
result 에 result 와 string 의
endOfLastMatch 부터 끝까지의 부분 문자열 을 문자열 연결 하여 재설정한다.
result 를 반환한다.
22.1.3.21 String.prototype.search ( regexp )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
regexp 가 undefined 또는 null 이 아니면,
searcher 에 ? GetMethod (regexp ,
%Symbol.search% )를
할당한다.
searcher 가 undefined 가 아니면,
? Call (searcher ,
regexp , « O »)를 반환한다.
string 에 ? ToString (O )를 할당한다.
rx 에 ? RegExpCreate (regexp ,
undefined )를 할당한다.
? Invoke (rx , %Symbol.search% , «
string »)를 반환한다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.22 String.prototype.slice ( start ,
end )
이 메서드는 이 객체를 문자열로 변환한 결과의 start 인덱스부터 end 인덱스(또는 end 가
undefined 일 경우 문자열 끝까지, end 는 포함하지 않음)까지의 부분
문자열 를 반환한다. start 가 음수이면, sourceLength +
start (sourceLength 는 문자열 길이)로 처리한다. end 가 음수이면,
sourceLength + end 로 처리한다(sourceLength 는 문자열 길이). 결과는
문자열 값이며, 문자열 객체가
아니다.
호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
len 에 S 의 길이를 할당한다.
intStart 에 ? ToIntegerOrInfinity (start )를
할당한다.
intStart = -∞이면 from 에 0을 할당한다.
그 외 intStart < 0이면 from 에 max (len +
intStart , 0)을 할당한다.
그 외에는 from 에 min (intStart , len )를
할당한다.
end 이 undefined 이면 intEnd 에 len 을,
아니면 intEnd 에 ? ToIntegerOrInfinity (end )를
할당한다.
intEnd = -∞이면 to 에 0을 할당한다.
그 외 intEnd < 0이면 to 에 max (len +
intEnd , 0)을 할당한다.
그 외에는 to 에 min (intEnd , len )를 할당한다.
from ≥ to 이면 빈 문자열을 반환한다.
S 의 from 부터 to 까지의 부분 문자열 을 반환한다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.23 String.prototype.split ( separator ,
limit )
이 메서드는 이 객체를 문자열로 변환한 결과의 부분 문자열을 저장한 배열(Array)을 반환한다. 부분 문자열은 왼쪽에서 오른쪽으로
separator 가 나타나는 위치를 찾아 구분하여 만들어지며, separator 는 반환 배열의 문자열에는 포함되지 않고,
문자열을 나누는 역할을 한다. separator 는 임의의 길이의 문자열이거나 %Symbol.split% 메서드를 가진 객체(예: RegExp)일
수 있다.
호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
separator 가 undefined 또는 null 이 아니면,
splitter 에 ? GetMethod (separator ,
%Symbol.split% )를 할당한다.
splitter 가 undefined 가 아니면,
? Call (splitter ,
separator , « O , limit »)를
반환한다.
S 에 ? ToString (O )를 할당한다.
limit 이 undefined 이면 lim 에 232 -
1을, 아니면 lim 에 ℝ (? ToUint32 (limit ))을 할당한다.
R 에 ? ToString (separator )를 할당한다.
lim = 0이면,
CreateArrayFromList (« »)를
반환한다.
separator 가 undefined 이면,
CreateArrayFromList («
S »)를 반환한다.
separatorLength 에 R 의 길이를 할당한다.
separatorLength = 0이면,
strLen 에 S 의 길이를 할당한다.
outLen 에 clamping
lim 을 0과 strLen 사이로 한 값을 할당한다.
head 에 S 의 0부터 outLen 까지의 부분
문자열 을 할당한다.
codeUnits 에 head 의 각 요소 코드 유닛 시퀀스로 구성된 List 를
할당한다.
CreateArrayFromList (codeUnits )를
반환한다.
S 가 빈 문자열이면 CreateArrayFromList («
S »)를 반환한다.
substrings 에 새 빈 List 를 할당한다.
i 에 0을 할당한다.
j 에 StringIndexOf (S ,
R , 0)을 할당한다.
j 가 not-found 가 아닌 동안 반복,
T 에 S 의 i 부터 j 까지의 부분
문자열 을 할당한다.
substrings 에 T 를 추가한다.
substrings 의 요소 개수가 lim 이면 CreateArrayFromList (substrings )를
반환한다.
i 를 j + separatorLength 로 재설정한다.
j 를 StringIndexOf (S ,
R , i )로 재설정한다.
T 에 S 의 i 부터 끝까지의 부분 문자열 을 할당한다.
substrings 에 T 를 추가한다.
CreateArrayFromList (substrings )를
반환한다.
참고 1
separator 값이 빈 문자열일 수 있다. 이 경우 separator 는 입력 문자열의 시작, 끝, 이전
separator 매치의 끝의 빈 부분 문자열 에는 매치되지 않는다.
separator 가 빈 문자열이면, 문자열은 개별 코드 유닛 요소로 분할되고, 결과 배열의 길이는 문자열의 길이와 같으며 각
부분 문자열 은 하나의 코드 유닛을 포함한다.
this 값이(혹은 변환된 값이) 빈 문자열이면, 결과는 separator 가 빈 문자열과 매치될 수
있는지에 따라 달라진다. 가능하면 결과 배열은 요소가 없고, 불가능하면 결과 배열은 빈 문자열 하나만 가진다.
separator 가 undefined 이면, 결과 배열은 변환된
this 값(문자열) 하나만 가진다. limit 가
undefined 가 아니면, 결과 배열은 최대 limit 개 요소로 잘린다.
참고 2
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.24 String.prototype.startsWith ( searchString
[ , position ] )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
isRegExp 에 ? IsRegExp (searchString )를 할당한다.
isRegExp 가 true 이면 TypeError 예외를 던진다.
searchStr 에 ? ToString (searchString )를 할당한다.
len 에 S 의 길이를 할당한다.
position 이 undefined 이면 pos 에 0을, 아니면
pos 에 ? ToIntegerOrInfinity (position )을
할당한다.
start 에 clamping 한 pos 를 0과 len
사이로 할당한다.
searchLength 에 searchStr 의 길이를 할당한다.
searchLength = 0이면 true 를 반환한다.
end 에 start + searchLength 를 할당한다.
end > len 이면 false 를 반환한다.
substring 에 S 의 start 부터 end 까지의 부분 문자열 을
할당한다.
substring 이 searchStr 이면 true 를 반환한다.
false 를 반환한다.
참고 1
이 메서드는 searchString 을 문자열로 변환한 코드 유닛 시퀀스가 이 객체(문자열로 변환)의
position 인덱스에서 시작하는 코드 유닛과 같으면 true 를 반환한다. 그렇지 않으면
false 를 반환한다.
참고 2
첫 번째 인수가 RegExp인 경우 예외를 던지는 것은, 향후 버전에서 그러한 인수 값을 허용하는 확장을 정의할 수 있도록 하기 위함이다.
참고 3
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.25 String.prototype.substring ( start ,
end )
이 메서드는 이 객체를 문자열로 변환한 결과의 start 인덱스부터 end 인덱스(문자열 끝까지, end 는
포함하지 않음)까지의 부분 문자열 를 반환한다. 결과는 문자열 값이며, 문자열 객체가
아니다.
각 인수가 NaN 또는 음수이면 0으로 대체된다. 각 인수가 문자열의 길이보다 크면 문자열의 길이로 대체된다.
start 가 end 보다 크면, 두 인수를 서로 바꾼다.
호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
len 에 S 의 길이를 할당한다.
intStart 에 ? ToIntegerOrInfinity (start )를
할당한다.
end 이 undefined 이면 intEnd 에 len 을,
아니면 intEnd 에 ? ToIntegerOrInfinity (end )를
할당한다.
finalStart 에 clamping 한 intStart 를 0과
len 사이로 할당한다.
finalEnd 에 clamping 한 intEnd 를 0과
len 사이로 할당한다.
from 에 min (finalStart ,
finalEnd )를 할당한다.
to 에 max (finalStart ,
finalEnd )를 할당한다.
S 의 from 부터 to 까지의 부분 문자열 을 반환한다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.26 String.prototype.toLocaleLowerCase ( [
reserved1 [ , reserved2 ] ] )
ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 해당 메서드는 ECMA-402 명세대로 구현되어야 한다. ECMA-402 API를 포함하지
않는 구현의 경우 아래 명세를 따릅니다:
이 메서드는 6.1.4 에 설명된 대로 문자열
값을 UTF-16 인코딩 코드 포인트 시퀀스로 해석합니다.
toLowerCase와 동작은 동일하지만, 결과가 호스트 환경 의 현재 로케일의 관습에 따라 로케일
의존적으로 생성된다는 점만 다릅니다. 몇몇 경우(예: 터키어)에서 해당 언어의 규칙이 일반 유니코드 대소문자 변환 규칙과 충돌할 때만 차이가 있습니다.
이 메서드의 선택적 인수의 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 인수 위치에 다른 용도를 할당해서는 안
됩니다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.27 String.prototype.toLocaleUpperCase ( [
reserved1 [ , reserved2 ] ] )
ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 해당 메서드는 ECMA-402 명세대로 구현되어야 한다. ECMA-402 API를 포함하지
않는 구현의 경우 아래 명세를 따릅니다:
이 메서드는 6.1.4 에 설명된 대로 문자열
값을 UTF-16 인코딩 코드 포인트 시퀀스로 해석합니다.
toUpperCase와 동작은 동일하지만, 결과가 호스트 환경 의 현재 로케일의 관습에 따라 로케일
의존적으로 생성된다는 점만 다릅니다. 몇몇 경우(예: 터키어)에서 해당 언어의 규칙이 일반 유니코드 대소문자 변환 규칙과 충돌할 때만 차이가 있습니다.
이 메서드의 선택적 인수의 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 인수 위치에 다른 용도를 할당해서는 안
됩니다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.28 String.prototype.toLowerCase ( )
이 메서드는 6.1.4 에 설명된 대로 문자열
값을 UTF-16 인코딩 코드 포인트 시퀀스로 해석합니다.
호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
sText 에 StringToCodePoints (S )를
할당한다.
lowerText 에 유니코드 기본 대소문자 변환 알고리즘에 따라 toLowercase(sText )를 적용한 값을
할당한다.
L 에 CodePointsToString (lowerText )를
할당한다.
L 을 반환한다.
결과는 반드시 유니코드 문자 데이터베이스의 로케일 비의존적 대소문자 변환에 따라 도출되어야 한다(UnicodeData.txt
파일뿐만 아니라, 함께 제공되는 SpecialCasing.txt
파일에 있는 모든 로케일 비의존적 매핑도 포함).
참고 1
일부 코드 포인트의 대소문자 변환 결과는 여러 코드 포인트가 될 수 있다. 이 경우 결과 문자열의 길이는 원본 문자열과 다를 수 있다.
toUpperCase와 toLowerCase 모두 문맥에 따라 동작하므로, 두 메서드는 대칭적이지 않다.
즉, s.toUpperCase().toLowerCase()는 반드시 s.toLowerCase()와 같지
않다.
참고 2
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.29 String.prototype.toString ( )
이 메서드는 호출 시 다음 단계를 수행한다:
? ThisStringValue (this
값)을 반환한다.
참고
String 객체에 대해 이 메서드는 valueOf 메서드와 동일한 값을 반환한다.
22.1.3.30 String.prototype.toUpperCase ( )
이 메서드는 6.1.4 에 설명된 대로 문자열
값을 UTF-16 인코딩 코드 포인트 시퀀스로 해석합니다.
동작은 String.prototype.toLowerCase와 동일하지만, 문자열을 유니코드 기본 대소문자 변환 알고리즘의 toUppercase로
매핑한다는 점만 다릅니다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.31 String.prototype.toWellFormed ( )
이 메서드는 이 객체의 모든 리딩 서로게이트 및 트레일링
서로게이트 중 서로게이트 페어 의 일부가 아닌 것을 U+FFFD(대체 문자)로 대체한 문자열 표현을
반환한다.
호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값을 할당한다.
S 에 ? ToString (O )를 할당한다.
strLen 에 S 의 길이를 할당한다.
k 에 0을 할당한다.
result 에 빈 문자열을 할당한다.
k < strLen 동안 반복,
cp 에 CodePointAt (S ,
k )를 할당한다.
cp .[[IsUnpairedSurrogate]] 가
true 이면,
result 에 result 와 0xFFFD(대체 문자)를 문자열 연결 하여 재할당한다.
그 외,
result 에 result 와 UTF16EncodeCodePoint (cp .[[CodePoint]] )를 문자열 연결 하여 재할당한다.
k 를 k + cp .[[CodeUnitCount]] 로 재설정한다.
result 를 반환한다.
22.1.3.32 String.prototype.trim ( )
이 메서드는 6.1.4 에 따라 문자열 값을
UTF-16 인코딩 코드 포인트 시퀀스로 해석한다.
호출 시 다음 단계를 수행한다:
S 에 this 값을 할당한다.
? TrimString (S ,
start+end )를 반환한다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 String 객체일 필요는 없다. 따라서 다른 종류의
객체에서 메서드로 사용할 수 있다.
22.1.3.32.1 TrimString ( string , where
)
TrimString 추상 연산은 string (ECMAScript 언어
값 )과 where (start ,
end , start+end )를 인수로 받고 정상 완료(문자열 포함) 또는
throw 완료 를 반환한다.
string 을 6.1.4 에 따라
UTF-16 인코딩 코드 포인트 시퀀스로 해석한다. 호출 시 다음 단계를 수행한다:
str 에 ? RequireObjectCoercible (string )를
할당한다.
S 에 ? ToString (str )를 할당한다.
where 가 start 이면,
T 에 S 의 앞쪽 공백이 제거된 복사본을 할당한다.
그 외 where 가 end 이면,
T 에 S 의 뒤쪽 공백이 제거된 복사본을 할당한다.
그 외,
Assert : where 가
start+end 임을 확인한다.
T 에 S 의 앞뒤 공백이 모두 제거된 복사본을 할당한다.
T 를 반환한다.
공백(white space)의 정의는 WhiteSpace 와 LineTerminator 의 합집합이다. 유니코드 일반 카테고리
“Space_Separator”(“Zs”)에 해당하는지 판단할 때, 코드 유닛 시퀀스는 6.1.4 에 따라
UTF-16 인코딩 코드 포인트 시퀀스로 해석한다.
22.1.3.33 String.prototype.trimEnd ( )
이 메서드는 6.1.4 에 따라 문자열 값을
UTF-16 인코딩 코드 포인트 시퀀스로 해석한다.
호출 시 다음 단계를 수행한다:
S 에 this 값을 할당한다.
? TrimString (S ,
end )를 반환한다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 String 객체일 필요는 없다. 따라서 다른 종류의
객체에서 메서드로 사용할 수 있다.
22.1.3.34 String.prototype.trimStart ( )
이 메서드는 6.1.4 에 따라 문자열 값을
UTF-16 인코딩 코드 포인트 시퀀스로 해석한다.
호출 시 다음 단계를 수행한다:
S 에 this 값을 할당한다.
? TrimString (S ,
start )를 반환한다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 String 객체일 필요는 없다. 따라서 다른 종류의
객체에서 메서드로 사용할 수 있다.
22.1.3.35 String.prototype.valueOf ( )
이 메서드는 호출 시 다음 단계를 수행한다:
? ThisStringValue (this
값을 반환한다.
22.1.3.35.1 ThisStringValue ( value )
ThisStringValue 추상 연산은 value (ECMAScript 언어
값 )를 인수로 받고 정상 완료(문자열 포함) 또는
throw 완료 를 반환한다.
호출 시 다음 단계를 수행한다:
value 가 문자열 이면
value 를 반환한다.
value 가 객체 이고 value 에 [[StringData]] 내부 슬롯이 있으면,
s 에 value .[[StringData]] 를
할당한다.
Assert : s 가 문자열 임을
확인한다.
s 를 반환한다.
TypeError 예외를 던진다.
22.1.3.36 String.prototype [ %Symbol.iterator% ] ( )
이 메서드는 문자열 값의 코드 포인트를 반복하는 이터레이터 객체 를 반환하며, 각 코드 포인트를 문자열 값으로
반환한다.
호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값을 할당한다.
s 에 ? ToString (O )를 할당한다.
closure 에 s 를 캡처하고 다음 단계를 수행하는 파라미터 없는 새로운 Abstract Closure 를 할당한다:
len 에 s 의 길이를 할당한다.
position 에 0을 할당한다.
position < len 동안 반복,
cp 에 CodePointAt (s ,
position )를 할당한다.
nextIndex 에 position + cp .[[CodeUnitCount]] 를 할당한다.
resultString 에 s 의 position 부터
nextIndex 까지의 부분 문자열 를
할당한다.
position 을 nextIndex 로 재설정한다.
? GeneratorYield (CreateIteratorResultObject (resultString ,
false ))를 수행한다.
NormalCompletion (unused )를
반환한다.
CreateIteratorFromClosure (closure ,
"%StringIteratorPrototype%" , %StringIteratorPrototype% )를
반환한다.
이 메서드의 "name" 프로퍼티 값은 "[Symbol.iterator]" 이다.
22.1.4 String 인스턴스의 프로퍼티
String 인스턴스는 String 익조틱 객체 이며 해당 객체에 대해 지정된 내부 메서드를 가진다.
String 인스턴스는 String 프로토타입 객체 로부터
프로퍼티를 상속받는다. 또한 String 인스턴스는 [[StringData]] 내부 슬롯을 가진다. [[StringData]] 내부 슬롯은 이 String 객체가 나타내는 문자열 값이다.
String 인스턴스는 "length" 프로퍼티와 정수 인덱스 이름을 가진 enumerable 프로퍼티 집합을 가진다.
22.1.4.1 length
이 String 객체가 나타내는 문자열 값의 요소 개수.
String 객체가 초기화되면, 이 프로퍼티는 변경되지 않는다. 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }이다.
22.1.5 String 이터레이터 객체
String 이터레이터 는 특정 String 인스턴스 객체에 대한 특정 반복(iteration)을 나타내는 객체이다. String
이터레이터 객체에는 생성자 라는 이름이 붙은 생성자는 없다. 대신, String 이터레이터 객체는 String
인스턴스 객체의 특정 메서드를 호출하여 생성된다.
22.1.5.1 %StringIteratorPrototype% 객체
%StringIteratorPrototype% 객체:
22.1.5.1.1 %StringIteratorPrototype%.next ( )
? GeneratorResume (this
값, empty ,
"%StringIteratorPrototype%" )를 반환한다.
22.1.5.1.2 %StringIteratorPrototype% [ %Symbol.toStringTag%
]
%Symbol.toStringTag% 프로퍼티의 초기값은
문자열 값 "String Iterator" 이다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] :
false , [[Configurable]] :
true }이다.
22.2 RegExp(정규 표현식) 객체
RegExp 객체는 정규 표현식과 관련 플래그를 포함한다.
참고
정규 표현식의 형식과 기능은 Perl 5 프로그래밍 언어의 정규 표현식 기능을 모델로 한다.
22.2.1 패턴
RegExp 생성자 는
입력 패턴 문자열에 다음 문법을 적용한다. 문법이 문자열을 Pattern 의 확장으로 해석할 수 없으면 오류가 발생한다.
문법
Pattern [UnicodeMode, UnicodeSetsMode,
NamedCaptureGroups] ::
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Disjunction [UnicodeMode,
UnicodeSetsMode, NamedCaptureGroups]
::
Alternative [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Alternative [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
|
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Alternative [UnicodeMode,
UnicodeSetsMode, NamedCaptureGroups]
::
[empty]
Alternative [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Term [?UnicodeMode, ?UnicodeSetsMode,
?NamedCaptureGroups]
Term [UnicodeMode, UnicodeSetsMode,
NamedCaptureGroups] ::
Assertion [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Atom [?UnicodeMode, ?UnicodeSetsMode,
?NamedCaptureGroups]
Atom [?UnicodeMode, ?UnicodeSetsMode,
?NamedCaptureGroups]
Quantifier
Assertion [UnicodeMode,
UnicodeSetsMode, NamedCaptureGroups]
::
^
$
\b
\B
(?=
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?!
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?<=
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?<!
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
Quantifier ::
QuantifierPrefix
QuantifierPrefix
?
QuantifierPrefix ::
*
+
?
{
DecimalDigits [~Sep]
}
{
DecimalDigits [~Sep]
,}
{
DecimalDigits [~Sep]
,
DecimalDigits [~Sep]
}
Atom [UnicodeMode, UnicodeSetsMode,
NamedCaptureGroups] ::
PatternCharacter
.
\
AtomEscape [?UnicodeMode,
?NamedCaptureGroups]
CharacterClass [?UnicodeMode,
?UnicodeSetsMode]
(
GroupSpecifier [?UnicodeMode] opt
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?
RegularExpressionModifiers
:
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?
RegularExpressionModifiers
-
RegularExpressionModifiers
:
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
RegularExpressionModifiers
::
[empty]
RegularExpressionModifiers
RegularExpressionModifier
RegularExpressionModifier
:: one of i
m s
SyntaxCharacter ::
one of ^ $ \
. * + ? (
) [ ] { }
|
PatternCharacter ::
SourceCharacter
but not SyntaxCharacter
AtomEscape [UnicodeMode,
NamedCaptureGroups] ::
DecimalEscape
CharacterClassEscape [?UnicodeMode]
CharacterEscape [?UnicodeMode]
[+NamedCaptureGroups]
k
GroupName [?UnicodeMode]
CharacterEscape [UnicodeMode]
::
ControlEscape
c
AsciiLetter
0
[lookahead ∉ DecimalDigit ]
HexEscapeSequence
RegExpUnicodeEscapeSequence [?UnicodeMode]
IdentityEscape [?UnicodeMode]
ControlEscape ::
one of f n r
t v
GroupSpecifier [UnicodeMode]
::
?
GroupName [?UnicodeMode]
GroupName [UnicodeMode]
::
<
RegExpIdentifierName [?UnicodeMode]
>
RegExpIdentifierName [UnicodeMode]
::
RegExpIdentifierStart [?UnicodeMode]
RegExpIdentifierName [?UnicodeMode]
RegExpIdentifierPart [?UnicodeMode]
RegExpIdentifierStart [UnicodeMode]
::
IdentifierStartChar
\
RegExpUnicodeEscapeSequence [+UnicodeMode]
[~UnicodeMode]
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpIdentifierPart [UnicodeMode]
::
IdentifierPartChar
\
RegExpUnicodeEscapeSequence [+UnicodeMode]
[~UnicodeMode]
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpUnicodeEscapeSequence [UnicodeMode]
:: [+UnicodeMode]
u
HexLeadSurrogate
\u
HexTrailSurrogate
[+UnicodeMode]
u
HexLeadSurrogate
[+UnicodeMode]
u
HexTrailSurrogate
[+UnicodeMode]
u
HexNonSurrogate
[~UnicodeMode]
u
Hex4Digits
[+UnicodeMode]
u{
CodePoint
}
UnicodeLeadSurrogate
::
any Unicode code point in the inclusive interval from U+D800 to
U+DBFF
UnicodeTrailSurrogate
::
any Unicode code point in the inclusive interval from U+DC00 to
U+DFFF
선택된 \u HexTrailSurrogate 에 대해 연관된 u
HexLeadSurrogate 의 선택이 모호한
경우, 해당 \u HexLeadSurrogate 는 그 외에는 대응되는 \u
HexTrailSurrogate 가 없는 가장
가까운 u HexLeadSurrogate 에 연관되어야 한다.
HexLeadSurrogate ::
Hex4Digits
but only if the MV of Hex4Digits is in the inclusive interval from 0xD800 to
0xDBFF
HexNonSurrogate ::
Hex4Digits
but only if the MV of Hex4Digits is not in the inclusive interval from 0xD800 to
0xDFFF
IdentityEscape [UnicodeMode]
:: [+UnicodeMode]
SyntaxCharacter
[+UnicodeMode]
/
[~UnicodeMode]
SourceCharacter
but not UnicodeIDContinue
DecimalEscape ::
NonZeroDigit
DecimalDigits [~Sep] opt
[lookahead ∉ DecimalDigit ]
CharacterClassEscape [UnicodeMode]
::
d
D
s
S
w
W
[+UnicodeMode]
p{
UnicodePropertyValueExpression
}
[+UnicodeMode]
P{
UnicodePropertyValueExpression
}
UnicodePropertyValueExpression
::
UnicodePropertyName
=
UnicodePropertyValue
LoneUnicodePropertyNameOrValue
UnicodePropertyName
::
UnicodePropertyNameCharacters
UnicodePropertyNameCharacters
::
UnicodePropertyNameCharacter
UnicodePropertyNameCharacters opt
UnicodePropertyValue
::
UnicodePropertyValueCharacters
LoneUnicodePropertyNameOrValue
::
UnicodePropertyValueCharacters
UnicodePropertyValueCharacters
::
UnicodePropertyValueCharacter
UnicodePropertyValueCharacters opt
UnicodePropertyValueCharacter
::
UnicodePropertyNameCharacter
DecimalDigit
UnicodePropertyNameCharacter
::
AsciiLetter
_
CharacterClass [UnicodeMode,
UnicodeSetsMode] ::
[
[lookahead ≠ ^ ]
ClassContents [?UnicodeMode,
?UnicodeSetsMode]
]
[^
ClassContents [?UnicodeMode,
?UnicodeSetsMode]
]
ClassContents [UnicodeMode,
UnicodeSetsMode] ::
[empty]
[~UnicodeSetsMode]
NonemptyClassRanges [?UnicodeMode]
[+UnicodeSetsMode]
ClassSetExpression
NonemptyClassRanges [UnicodeMode]
::
ClassAtom [?UnicodeMode]
ClassAtom [?UnicodeMode]
NonemptyClassRangesNoDash [?UnicodeMode]
ClassAtom [?UnicodeMode]
-
ClassAtom [?UnicodeMode]
ClassContents [?UnicodeMode,
~UnicodeSetsMode]
NonemptyClassRangesNoDash [UnicodeMode]
::
ClassAtom [?UnicodeMode]
ClassAtomNoDash [?UnicodeMode]
NonemptyClassRangesNoDash [?UnicodeMode]
ClassAtomNoDash [?UnicodeMode]
-
ClassAtom [?UnicodeMode]
ClassContents [?UnicodeMode,
~UnicodeSetsMode]
ClassAtom [UnicodeMode]
::
-
ClassAtomNoDash [?UnicodeMode]
ClassAtomNoDash [UnicodeMode]
::
SourceCharacter
but not one of \ or ] or
-
\
ClassEscape [?UnicodeMode]
ClassEscape [UnicodeMode]
::
b
[+UnicodeMode]
-
CharacterClassEscape [?UnicodeMode]
CharacterEscape [?UnicodeMode]
ClassSetExpression
::
ClassUnion
ClassIntersection
ClassSubtraction
ClassUnion ::
ClassSetRange
ClassUnion opt
ClassSetOperand
ClassUnion opt
ClassIntersection
::
ClassSetOperand
&&
[lookahead ≠ & ]
ClassSetOperand
ClassIntersection
&&
[lookahead ≠ & ]
ClassSetOperand
ClassSubtraction ::
ClassSetOperand
--
ClassSetOperand
ClassSubtraction
--
ClassSetOperand
ClassSetRange ::
ClassSetCharacter
-
ClassSetCharacter
ClassSetOperand ::
NestedClass
ClassStringDisjunction
ClassSetCharacter
NestedClass ::
[
[lookahead ≠ ^ ]
ClassContents [+UnicodeMode,
+UnicodeSetsMode]
]
[^
ClassContents [+UnicodeMode,
+UnicodeSetsMode]
]
\
CharacterClassEscape [+UnicodeMode]
참고 1
여기서 처음 두 줄은 CharacterClass와 동일하다.
ClassStringDisjunction
::
\q{
ClassStringDisjunctionContents
}
ClassStringDisjunctionContents
::
ClassString
ClassString
|
ClassStringDisjunctionContents
ClassString ::
[empty]
NonEmptyClassString
NonEmptyClassString
::
ClassSetCharacter
NonEmptyClassString opt
ClassSetCharacter
::
[lookahead ∉ ClassSetReservedDoublePunctuator ]
SourceCharacter
but not ClassSetSyntaxCharacter
\
CharacterEscape [+UnicodeMode]
\
ClassSetReservedPunctuator
\b
ClassSetReservedDoublePunctuator
:: one of &&
!! ## $$ %%
** ++ ,, ..
:: ;; << ==
>> ?? @@ ^^
`` ~~
ClassSetSyntaxCharacter
:: one of (
) [ ] { }
/ - \ |
ClassSetReservedPunctuator
:: one of &
- ! # % ,
: ; < =
> @ ` ~
참고 2
이 섹션의 여러 생성식(production)은 B.1.2 섹션에서
대체 정의가 제공된다.
22.2.1.1 정적 의미론: 초기 오류
참고
Pattern :: Disjunction
QuantifierPrefix
::
{
DecimalDigits
,
DecimalDigits
}
Atom ::
(?
RegularExpressionModifiers
:
Disjunction
)
Atom ::
(?
RegularExpressionModifiers
-
RegularExpressionModifiers
:
Disjunction
)
AtomEscape ::
k
GroupName
AtomEscape ::
DecimalEscape
NonemptyClassRanges
::
ClassAtom
-
ClassAtom
ClassContents
NonemptyClassRangesNoDash
::
ClassAtomNoDash
-
ClassAtom
ClassContents
RegExpIdentifierStart
::
\
RegExpUnicodeEscapeSequence
RegExpIdentifierStart
::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpIdentifierPart
::
\
RegExpUnicodeEscapeSequence
RegExpIdentifierPart
::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
UnicodePropertyValueExpression
::
UnicodePropertyName
=
UnicodePropertyValue
UnicodePropertyValueExpression
:: LoneUnicodePropertyNameOrValue
CharacterClassEscape
::
P{
UnicodePropertyValueExpression
}
CharacterClass ::
[^
ClassContents
]
NestedClass ::
[^
ClassContents
]
ClassSetRange ::
ClassSetCharacter
-
ClassSetCharacter
22.2.1.2 정적 의미론: CountLeftCapturingParensWithin (
node )
CountLeftCapturingParensWithin 추상 연산은 node (파싱 노드 )를 인수로 받고, 0 이상의
정수 를 반환한다.
node 내의 왼쪽 캡처 괄호 개수를 반환한다. 왼쪽 캡처 괄호 란,
Atom ::
(
GroupSpecifier opt
Disjunction
)
생성식에서 매치되는 모든 ( 패턴 문자이다.
참고
호출 시 다음 단계를 수행한다:
Assert :
node 는 RegExp 패턴 문법 의 생성식 인스턴스이다.
node 내에 포함된
Atom ::
(
GroupSpecifier opt
Disjunction
)
파싱 노드 개수를 반환한다.
22.2.1.3 정적 의미론: CountLeftCapturingParensBefore (
node )
CountLeftCapturingParensBefore 추상 연산은 node (파싱 노드 )를 인수로 받고, 0 이상의
정수 를 반환한다.
node 를 둘러싼 패턴 내에서 node 의 왼쪽에 위치하는 왼쪽 캡처 괄호 개수를 반환한다.
참고
호출 시 다음 단계를 수행한다:
Assert :
node 는 RegExp 패턴 문법 의 생성식 인스턴스이다.
pattern 에 node 를 포함하는 Pattern 을 할당한다.
pattern 내에서 node 의 앞에 위치하거나 node 를 포함하는
Atom ::
(
GroupSpecifier opt
Disjunction
)
파싱 노드 개수를 반환한다.
22.2.1.4 정적 의미론: MightBothParticipate ( x ,
y )
MightBothParticipate 추상 연산은 x (파싱 노드 )와
y (파싱 노드 )를 인수로 받고, Boolean 값을 반환한다. 호출 시
다음 단계를 수행한다:
Assert :
x 와 y 는 동일한 Pattern 으로 둘러싸여 있다.
둘러싸고 있는 Pattern 에
Disjunction
::
Alternative
|
Disjunction
파싱 노드 가 존재하고, x 가
Alternative 내에 포함되어
있고 y 가 파생된 Disjunction 내에 포함되어 있거나, x 가
파생된 Disjunction 내에
포함되어 있고 y 가 Alternative 내에 포함되어 있으면
false 를 반환한다.
true 를 반환한다.
22.2.1.5 정적 의미론: CapturingGroupNumber
구문 지향 연산
CapturingGroupNumber는 인수를 받지 않고 양의 정수 를 반환한다.
참고
다음 생성식에 대해 개별적으로 정의된다:
DecimalEscape ::
NonZeroDigit
NonZeroDigit 의 MV를
반환한다.
DecimalEscape ::
NonZeroDigit
DecimalDigits
n 에 DecimalDigits 의 코드 포인트 개수를 할당한다.
(NonZeroDigit 의 MV
×
10n + DecimalDigits 의 MV)을 반환한다.
“NonZeroDigit 의 MV” 및
“DecimalDigits 의 MV”의 정의는
12.9.3 에 있다.
22.2.1.6 정적 의미론: IsCharacterClass
구문 지향 연산
IsCharacterClass는 인수를 받지 않고 Boolean 값을 반환한다.
참고
다음 생성식에 대해 개별적으로 정의된다:
ClassAtom ::
-
ClassAtomNoDash
::
SourceCharacter
but not one of \ or ] or
-
ClassEscape ::
b
-
CharacterEscape
false 를 반환한다.
ClassEscape ::
CharacterClassEscape
true 를 반환한다.
22.2.1.7 정적 의미론: CharacterValue
구문 지향 연산
CharacterValue는 인수를 받지 않으며, 0 이상의 정수 를 반환한다.
참고 1
다음 생성식에 대해 개별적으로 정의된다:
ClassAtom :: -
U+002D(HYPHEN-MINUS)의 숫자 값을 반환한다.
ClassAtomNoDash
:: SourceCharacter
but not one of \ or ] or
-
ch 에 SourceCharacter 가 매치한 코드 포인트를 할당한다.
ch 의 숫자 값을 반환한다.
ClassEscape ::
b
U+0008(BACKSPACE)의 숫자 값을 반환한다.
ClassEscape ::
U+002D(HYPHEN-MINUS)의 숫자 값을 반환한다.
CharacterEscape
:: ControlEscape
표 67 에 따라 숫자 값을
반환한다.
표 67: ControlEscape 코드 포인트 값
ControlEscape
숫자 값
코드 포인트
유니코드 이름
기호
t
9
U+0009
CHARACTER TABULATION
<HT>
n
10
U+000A
LINE FEED (LF)
<LF>
v
11
U+000B
LINE TABULATION
<VT>
f
12
U+000C
FORM FEED (FF)
<FF>
r
13
U+000D
CARRIAGE RETURN (CR)
<CR>
CharacterEscape
::
c
AsciiLetter
ch 에 AsciiLetter 가 매치한 코드 포인트를 할당한다.
i 에 ch 의 숫자 값을 할당한다.
i 를 32로 나눈 나머지를 반환한다.
CharacterEscape
::
0
[lookahead ∉ DecimalDigit ]
U+0000(NULL)의 숫자 값을 반환한다.
참고 2
\0은 <NUL> 문자를 나타내며, 뒤에 십진수 숫자가 올 수 없다.
CharacterEscape
:: HexEscapeSequence
HexEscapeSequence 의 MV를 반환한다.
RegExpUnicodeEscapeSequence
::
u
HexLeadSurrogate
\u
HexTrailSurrogate
lead 에 HexLeadSurrogate 의 CharacterValue 를
할당한다.
trail 에 HexTrailSurrogate 의 CharacterValue 를
할당한다.
cp 에 UTF16SurrogatePairToCodePoint (lead ,
trail )를 할당한다.
cp 의 숫자 값을 반환한다.
RegExpUnicodeEscapeSequence
::
u
Hex4Digits
Hex4Digits 의 MV를
반환한다.
RegExpUnicodeEscapeSequence
::
u{
CodePoint
}
CodePoint 의 MV를 반환한다.
HexLeadSurrogate
:: Hex4Digits
HexTrailSurrogate
:: Hex4Digits
HexNonSurrogate
:: Hex4Digits
Hex4Digits 의 MV를
반환한다.
CharacterEscape
:: IdentityEscape
ch 에 IdentityEscape 가 매치한 코드 포인트를 할당한다.
ch 의 숫자 값을 반환한다.
ClassSetCharacter
:: SourceCharacter
but not ClassSetSyntaxCharacter
ch 에 SourceCharacter 가 매치한 코드 포인트를 할당한다.
ch 의 숫자 값을 반환한다.
ClassSetCharacter
::
\
ClassSetReservedPunctuator
ch 에 ClassSetReservedPunctuator 가
매치한 코드 포인트를 할당한다.
ch 의 숫자 값을 반환한다.
ClassSetCharacter
:: \b
U+0008(BACKSPACE)의 숫자 값을 반환한다.
22.2.1.8 정적 의미론: MayContainStrings
구문 지향 연산
MayContainStrings는 인수를 받지 않으며 Boolean 값을 반환한다. 다음 생성식에 대해 개별적으로 정의된다:
CharacterClassEscape
::
d
D
s
S
w
W
P{
UnicodePropertyValueExpression
}
UnicodePropertyValueExpression
::
UnicodePropertyName
=
UnicodePropertyValue
NestedClass ::
[^
ClassContents
]
ClassContents ::
[empty]
NonemptyClassRanges
ClassSetOperand
::
ClassSetCharacter
false 를 반환한다.
UnicodePropertyValueExpression
:: LoneUnicodePropertyNameOrValue
LoneUnicodePropertyNameOrValue 가
표 71 의
"Property name" 열에 나열된 문자열의 바이너리 프로퍼티인 경우 true 를 반환한다.
false 를 반환한다.
ClassUnion ::
ClassSetRange
ClassUnion opt
ClassUnion 가 존재하면,
MayContainStrings 를
ClassUnion 에 대해 반환한다.
false 를 반환한다.
ClassUnion ::
ClassSetOperand
ClassUnion opt
MayContainStrings 가
ClassSetOperand 에 대해
true 이면 true 를 반환한다.
ClassUnion 가 존재하면,
MayContainStrings 를
ClassUnion 에 대해 반환한다.
false 를 반환한다.
ClassIntersection
::
ClassSetOperand
&&
ClassSetOperand
첫 번째 MayContainStrings 가
ClassSetOperand 에 대해
false 이면 false 를 반환한다.
두 번째 MayContainStrings 가
ClassSetOperand 에 대해
false 이면 false 를 반환한다.
true 를 반환한다.
ClassIntersection
::
ClassIntersection
&&
ClassSetOperand
MayContainStrings 가
ClassIntersection 에 대해
false 이면 false 를 반환한다.
MayContainStrings 가
ClassSetOperand 에 대해
false 이면 false 를 반환한다.
true 를 반환한다.
ClassSubtraction
::
ClassSetOperand
--
ClassSetOperand
첫 번째 MayContainStrings 를
ClassSetOperand 에 대해 반환한다.
ClassSubtraction
::
ClassSubtraction
--
ClassSetOperand
MayContainStrings 를
ClassSubtraction 에 대해 반환한다.
ClassStringDisjunctionContents
::
ClassString
|
ClassStringDisjunctionContents
MayContainStrings 가
ClassString 에 대해
true 이면 true 를 반환한다.
MayContainStrings 를
ClassStringDisjunctionContents 에
대해 반환한다.
ClassString ::
[empty]
true 를 반환한다.
ClassString ::
NonEmptyClassString
MayContainStrings 를
NonEmptyClassString 에 대해 반환한다.
NonEmptyClassString
::
ClassSetCharacter
NonEmptyClassString opt
NonEmptyClassString 가 존재하면
true 를 반환한다.
false 를 반환한다.
22.2.1.9 정적 의미론: GroupSpecifiersThatMatch (
thisGroupName )
GroupSpecifiersThatMatch 추상 연산은 thisGroupName (GroupName 파싱
노드 )를 인수로 받고, List
타입의 GroupSpecifier
파싱
노드 리스트를 반환한다. 호출 시 다음 단계를 수행한다:
name 에 CapturingGroupName
of thisGroupName 를 할당한다.
pattern 에 thisGroupName 을 포함하는 Pattern 을 할당한다.
result 에 새로운 빈 List 를 할당한다.
pattern 이 포함하는 각 GroupSpecifier gs 에 대해
반복한다:
gs 의 CapturingGroupName
이 name 과 같으면,
gs 를 result 에 추가한다.
result 를 반환한다.
22.2.1.10 정적 의미론: CapturingGroupName
구문 지향 연산
CapturingGroupName은 인수를 받지 않으며 문자열을 반환한다. 다음 생성식에 대해 개별적으로 정의된다:
GroupName ::
<
RegExpIdentifierName
>
idTextUnescaped 에 RegExpIdentifierName 의
RegExpIdentifierCodePoints 를
할당한다.
CodePointsToString (idTextUnescaped )을
반환한다.
22.2.1.11 정적 의미론: RegExpIdentifierCodePoints
구문 지향 연산
RegExpIdentifierCodePoints는 인수를 받지 않으며 코드 포인트 List 를 반환한다. 다음 생성식에 대해
개별적으로 정의된다:
RegExpIdentifierName
:: RegExpIdentifierStart
cp 에 RegExpIdentifierStart 의
RegExpIdentifierCodePoint 를
할당한다.
« cp »를 반환한다.
RegExpIdentifierName
::
RegExpIdentifierName
RegExpIdentifierPart
cps 에 파생된 RegExpIdentifierName 의
RegExpIdentifierCodePoints 를
할당한다.
cp 에 RegExpIdentifierPart 의
RegExpIdentifierCodePoint 를
할당한다.
cps 와 « cp »의 리스트 연결 을 반환한다.
22.2.1.12 정적 의미론: RegExpIdentifierCodePoint
구문 지향 연산
RegExpIdentifierCodePoint는 인수를 받지 않으며 코드 포인트를 반환한다. 다음 생성식에 대해 개별적으로 정의된다:
RegExpIdentifierStart
:: IdentifierStartChar
IdentifierStartChar 가 매치한 코드
포인트를 반환한다.
RegExpIdentifierPart
:: IdentifierPartChar
IdentifierPartChar 가 매치한 코드 포인트를
반환한다.
RegExpIdentifierStart
::
\
RegExpUnicodeEscapeSequence
RegExpIdentifierPart
::
\
RegExpUnicodeEscapeSequence
RegExpUnicodeEscapeSequence 의
CharacterValue 의
숫자 값을 가진 코드 포인트를 반환한다.
RegExpIdentifierStart
::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpIdentifierPart
::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
lead 에 UnicodeLeadSurrogate 가 매치한 코드
포인트의 숫자 값인 코드 유닛을 할당한다.
trail 에 UnicodeTrailSurrogate 가 매치한
코드 포인트의 숫자 값인 코드 유닛을 할당한다.
UTF16SurrogatePairToCodePoint (lead ,
trail )을 반환한다.
22.2.2 패턴 의미론
정규 표현식 패턴은 아래에 설명된 과정을 사용하여 추상 클로저 로 변환된다. 구현체는 결과가 동일하다면 아래에 나열된 알고리즘보다
더 효율적인 알고리즘을 사용하는 것이 권장된다. 추상 클로저 는 RegExp 객체의 [[RegExpMatcher]] 내부 슬롯의 값으로 사용된다.
Pattern 은 연관된 플래그에 u나
v가 모두 없으면 BMP 패턴이다. 그렇지 않으면 유니코드 패턴이다. BMP 패턴은 기본 다국어 평면 범위 내의 16비트 값 시퀀스로 해석된 문자열에
대해 매칭을 수행한다. 유니코드 패턴은 UTF-16으로 인코딩된 유니코드 코드 포인트 시퀀스로 해석된 문자열에 대해 매칭을 수행한다. BMP 패턴의 동작을 설명하는 문맥에서
“문자”란 16비트 유니코드 BMP 코드 포인트 하나를 의미한다. 유니코드 패턴의 동작을 설명하는 문맥에서 “문자”란 UTF-16 인코딩된 코드 포인트(6.1.4 )를 의미한다. 두 경우 모두
“문자 값”이란 해당 비인코딩 코드 포인트의 숫자 값을 뜻한다.
Pattern 의 문법과 의미론은 Pattern 의 소스 텍스트가 각각 List 타입의 SourceCharacter 값들로 구성된 것으로
정의된다. 각 SourceCharacter 는
하나의 유니코드 코드 포인트에 대응한다. 만약 BMP 패턴에 비BMP SourceCharacter 가 포함된 경우 전체 패턴은 UTF-16으로 인코딩되고,
그 인코딩의 개별 코드 유닛이 List 의 요소로 사용된다.
참고
예를 들어, 소스 텍스트에서 단일 비BMP 문자 U+1D11E(MUSICAL SYMBOL G CLEF)로 표현된 패턴을 생각해보자. 유니코드 패턴으로 해석하면,
이는 단일 코드 포인트 U+1D11E로 구성된 단일 요소(문자) List 가 된다. 하지만 BMP
패턴으로 해석하면, 먼저 UTF-16으로 인코딩되어 코드 유닛 0xD834와 0xDD1E로 구성된 두 요소 List 가 된다.
패턴은 RegExp 생성자 에 ECMAScript 문자열 값으로 전달되며, 비BMP 문자는
UTF-16으로 인코딩되어 있다. 예를 들어, 단일 문자 MUSICAL SYMBOL G CLEF 패턴은 문자열 값으로 표현하면 문자열 길이 2이고, 요소는
코드 유닛 0xD834와 0xDD1E이다. 따라서 BMP 패턴으로 두 패턴 문자로 처리하는 데 추가 변환이 필요하지 않다. 하지만 유니코드 패턴으로 처리하려면
UTF16SurrogatePairToCodePoint 를
사용해 단일 패턴 문자(코드 포인트 U+1D11E)만을 요소로 가지는 List 를 생성해야 한다.
구현체는 실제로 이러한 UTF-16 변환을 수행하지 않을 수도 있지만, 이 명세의 의미론은 패턴 매칭 결과가 이러한 변환이 수행된 것과 같아야 함을 요구한다.
22.2.2.1 표기법
아래 설명에서는 다음 내부 데이터 구조를 사용합니다:
CharSetElement 는 다음 두 가지 중 하나입니다:
rer .[[UnicodeSets]] 가
false 인 경우, CharSetElement는 위의 패턴 의미론에서 말하는 문자입니다.
rer .[[UnicodeSets]] 가
true 인 경우, CharSetElement는 위의 패턴 의미론에서 말하는 문자로 이루어진 시퀀스입니다.
여기에는 빈 시퀀스, 한 글자의 시퀀스, 두 글자 이상의 시퀀스가 포함됩니다. 편의를 위해, 이러한 종류의 CharSetElement를 다룰
때, 개별 문자는 한 글자 시퀀스와 동등하게 취급됩니다.
CharSet 은
CharSetElement의 수학적 집합입니다.
CaptureRange 는 Record { [[StartIndex]] , [[EndIndex]] }로, 캡처에
포함된 문자 범위를 나타냅니다. [[StartIndex]] 는 Input 내 범위의 시작
인덱스(포함)를 나타내는 정수 이고, [[EndIndex]] 는
Input 내 범위의 끝 인덱스(미포함)를 나타내는 정수 입니다. 어떤 CaptureRange 에 대해서도, 이
인덱스들은 [[StartIndex]] ≤ [[EndIndex]]
불변식을 만족해야 합니다.
MatchState 는 Record { [[Input]] , [[EndIndex]] , [[Captures]] }로, [[Input]] 는 매칭되는 문자열을
나타내는 문자 List , [[EndIndex]] 는 정수 , [[Captures]] 는 패턴 내의
왼쪽 캡처 괄호 마다 하나씩의 값을 가지는
List 입니다. MatchStates 는 정규 표현식 매칭 알고리즘에서 부분 매칭
상태를 나타내는 데 사용됩니다. [[EndIndex]] 는 패턴이 지금까지 매치한 마지막 입력 문자 인덱스에 1을
더한 값이며, [[Captures]] 는 캡처 괄호의 결과를 저장합니다.
n 번째 [[Captures]] 요소는
n 번째 캡처 괄호에서 캡처된 문자 범위를 나타내는 CaptureRange 이거나, 해당
캡처 괄호에 아직 도달하지 않은 경우 undefined 입니다. 백트래킹 때문에 매칭 과정 중에는 여러 MatchStates 가 동시에 사용될 수 있습니다.
MatcherContinuation 은 추상 클로저 로, 하나의
MatchState 인수를 받고 MatchState 또는
failure 를 반환합니다. MatcherContinuation 은 클로저의 캡처
값에 의해 지정된 패턴의 나머지 부분을 Input 에 대해, 주어진 MatchState 중간 상태부터 매칭을
시도합니다. 매칭에 성공하면 MatcherContinuation 은 도달한 최종
MatchState 를 반환하고, 실패하면 MatcherContinuation 은
failure 를 반환합니다.
Matcher 는 추상
클로저 로, 두 개의 인수—MatchState 와 MatcherContinuation —를 받아
MatchState 또는
failure 를 반환합니다. Matcher 는 클로저의 캡처 값에 의해 지정된
패턴의 중간 부분을 MatchState 의 [[Input]] 에 대해 주어진 MatchState 중간 상태부터 매칭을
시도합니다. MatcherContinuation 인수는 패턴의
나머지 부분을 매칭하는 클로저여야 합니다. 패턴의 중간 부분을 매칭하여 새로운 MatchState 를 얻은 후,
Matcher 는 그 새로운 MatchState 에 대해 MatcherContinuation 을 호출하여 패턴의
나머지 부분도 매칭 가능한지 확인합니다. 가능하면 Matcher 는 MatchState 를 MatcherContinuation 에서 반환된 값을
그대로 반환합니다. 그렇지 않으면 Matcher 는 선택 지점에서 다른 선택을 시도하며 MatcherContinuation 를 반복적으로
호출하여 성공하거나 모든 가능성을 소진할 때까지 진행합니다.
22.2.2.1.1 RegExp 레코드
RegExp 레코드 는 컴파일 중과 매칭 중에 필요할 수 있는
RegExp에 대한 정보를 저장하는 데 사용되는 Record 값입니다.
다음 필드를 가집니다:
표 68: RegExp 레코드 필드
필드 이름
값
의미
[[IgnoreCase]]
Boolean
RegExp의 플래그에 "i" 가 포함되어 있는지 나타냄
[[Multiline]]
Boolean
RegExp의 플래그에 "m" 가 포함되어 있는지 나타냄
[[DotAll]]
Boolean
RegExp의 플래그에 "s" 가 포함되어 있는지 나타냄
[[Unicode]]
Boolean
RegExp의 플래그에 "u" 가 포함되어 있는지 나타냄
[[UnicodeSets]]
Boolean
RegExp의 플래그에 "v" 가 포함되어 있는지 나타냄
[[CapturingGroupsCount]]
0 이상의 정수
RegExp 패턴 내 왼쪽
캡처 괄호 의 개수
22.2.2.2 실행 시 의미론: CompilePattern
구문 지향 연산
CompilePattern은 rer (RegExp
레코드 )를 인수로 받고, 문자 List 와 0 이상의 정수 를 인수로 받아 MatchState 또는
failure 를 반환하는 추상 클로저 를 반환한다. 다음 생성식에 대해
개별적으로 정의된다:
Pattern :: Disjunction
m 에 CompileSubpattern 을 Disjunction 에
rer 와 forward 를 인수로 호출한 결과를 할당한다.
다음과 같이 호출될 때 아래 단계를 수행하는 (Input , index ) 파라미터를 가지며
rer 와 m 을 캡처하는 새로운 추상 클로저 를 반환한다:
Assert : Input 은 문자 List 이다.
Assert : 0 ≤ index ≤
Input 의 요소 개수이다.
c 에 아무것도 캡처하지 않고 아래 단계를 수행하는 (y ) 파라미터를 가지는 새로운
MatcherContinuation 를
할당한다:
Assert : y 는
MatchState 이다.
y 를 반환한다.
cap 에 rer .[[CapturingGroupsCount]] 개의
undefined 값을 가지는 List 를
인덱스 1부터 rer .[[CapturingGroupsCount]] 까지
할당한다.
x 에 MatchState
{ [[Input]] : Input , [[EndIndex]] : index , [[Captures]] : cap }를 할당한다.
m (x , c )를 반환한다.
참고
패턴은 추상 클로저 값으로 컴파일된다.
RegExpBuiltinExec 는 이 절차를 문자
List 와 그
List 내의 오프셋에
적용해, 해당 오프셋에서 패턴이 정확히 매치되는지, 매치된다면 캡처 괄호의 값이 무엇인지 결정할 수 있다. 22.2.2 의 알고리즘은 패턴 컴파일 시
SyntaxError 예외를 던질 수 있도록 설계되어 있다. 하지만 패턴이 성공적으로 컴파일된 뒤에는, 결과로 얻은
추상 클로저 를 문자 List 에서 매치를 찾기
위해 적용했을 때 예외가 발생할 수 없다(단, 어디서든 발생 가능한 구현 정의 예외, 예를 들어
메모리 부족 등은 제외).
22.2.2.3 실행 시 의미론: CompileSubpattern
구문 지향 연산
CompileSubpattern은 rer (RegExp 레코드 )와
direction (forward 또는 backward )를 인수로
받고 Matcher 를 반환한다.
참고 1
다음 생성식에 대해 개별적으로 정의된다:
Disjunction ::
Alternative
|
Disjunction
m1 에 CompileSubpattern 을 Alternative 에
rer 와 direction 을 인수로 호출한 결과를 할당한다.
m2 에 CompileSubpattern 을 Disjunction 에
rer 와 direction 을 인수로 호출한 결과를 할당한다.
MatchTwoAlternatives (m1 ,
m2 )를 반환한다.
참고 2
| 정규 표현식 연산자는 두 가지 대안을 구분한다. 패턴은 먼저 왼쪽 Alternative (그리고 그 뒤의 정규 표현식)를 매칭 시도한다.
실패하면 오른쪽 Disjunction (그리고 그 뒤의 정규 표현식)를 시도한다. 왼쪽
Alternative , 오른쪽
Disjunction , 그리고 그
뒤의 정규 표현식 모두 선택 지점이 있으면, 그 뒤의 모든 선택을 먼저 시도한 다음 왼쪽 Alternative 의 다음 선택으로 넘어간다. 왼쪽 Alternative 의 선택이 모두
소진되면, 왼쪽 Alternative 대신 오른쪽 Disjunction 을 시도한다.
|로 건너뛴 패턴 부분의 캡처 괄호는 문자열 대신 undefined 값을 생성한다. 예를
들어,
/a|ab/.exec ("abc" )
의 결과는 "a" 이고 "ab" 가 아니다. 또,
/((a)|(ab))((c)|(bc))/.exec ("abc" )
의 결과 배열은
["abc" , "a" , "a" , undefined , "bc" , undefined , "bc" ]
이고,
["abc" , "ab" , undefined , "ab" , "c" , "c" , undefined ]
는 아니다.
두 대안의 시도 순서는 direction 값과 무관하다.
Alternative ::
[empty]
EmptyMatcher ()를 반환한다.
Alternative ::
Alternative
Term
m1 에 CompileSubpattern 을 Alternative 에
rer 와 direction 을 인수로 호출한 결과를 할당한다.
m2 에 CompileSubpattern 을 Term 에 rer 와
direction 을 인수로 호출한 결과를 할당한다.
MatchSequence (m1 ,
m2 , direction )를 반환한다.
참고 3
연속된 Term 들은
Input 의 연속된 부분을 동시에 매칭 시도한다. direction 이
forward 인 경우, 왼쪽 Alternative , 오른쪽 Term , 그리고 그 뒤의 정규 표현식 모두 선택
지점이 있으면, 그 뒤의 모든 선택을 먼저 시도한 다음 오른쪽 Term 의 다음 선택으로 넘어가고, 오른쪽 Term 의 모든 선택이 끝나면 왼쪽 Alternative 의 다음 선택으로
넘어간다. direction 이 backward 인 경우, Alternative 와 Term 의 평가 순서가 반대가 된다.
Term :: Assertion
CompileAssertion 을 Assertion 에
rer 를 인수로 호출한 결과를 반환한다.
참고 4
결과 Matcher 는 direction 과 무관하다.
Term :: Atom
CompileAtom 을 Atom 에 rer 와
direction 을 인수로 호출한 결과를 반환한다.
Term ::
Atom
Quantifier
m 에 CompileAtom 을 Atom 에 rer 와
direction 을 인수로 호출한 결과를 할당한다.
q 에 CompileQuantifier 을 Quantifier 에 대해 호출한 결과를
할당한다.
Assert :
q .[[Min]] ≤ q .[[Max]] .
parenIndex 에 CountLeftCapturingParensBefore (Term )의 결과를 할당한다.
parenCount 에 CountLeftCapturingParensWithin (Atom )의 결과를 할당한다.
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 m ,
q , parenIndex , parenCount 를 캡처하는 새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
RepeatMatcher (m ,
q .[[Min]] , q .[[Max]] , q .[[Greedy]] , x , c ,
parenIndex , parenCount )를 반환한다.
22.2.2.3.1 RepeatMatcher ( m , min ,
max , greedy , x , c , parenIndex ,
parenCount )
RepeatMatcher 추상 연산은 m (Matcher ), min (0 이상의 정수 ),
max (0 이상의 정수 또는 +∞), greedy (Boolean),
x (MatchState ), c (MatcherContinuation ),
parenIndex (0 이상의 정수 ), parenCount (0 이상의 정수 )를 인수로 받고
MatchState 또는
failure 를 반환한다. 호출 시 다음 단계를 수행한다:
만약 max = 0이면, c (x )를 반환한다.
d 에 다음과 같이 호출될 때 아래 단계를 수행하는 (y ) 파라미터를 가지며 m ,
min , max , greedy , x , c ,
parenIndex , parenCount 를 캡처하는 새로운 MatcherContinuation 를
할당한다:
Assert : y 는 MatchState 이다.
만약 min = 0이고 y .[[EndIndex]] = x .[[EndIndex]] 이면, failure 를
반환한다.
만약 min = 0이면 min2 는 0, 아니면 min2 는
min - 1로 한다.
만약 max = +∞이면 max2 는 +∞, 아니면 max2 는
max - 1로 한다.
RepeatMatcher (m ,
min2 , max2 , greedy , y ,
c , parenIndex , parenCount )를 반환한다.
cap 에 x .[[Captures]] 의 복사본을 할당한다.
각 정수 k 에 대해
포함 구간 parenIndex +
1부터 parenIndex + parenCount 까지 반복하며,
cap [k ]에 undefined 를 할당한다.
Input 에 x .[[Input]] 을 할당한다.
e 에 x .[[EndIndex]] 를 할당한다.
xr 에 MatchState { [[Input]] : Input , [[EndIndex]] : e , [[Captures]] : cap }를 할당한다.
만약 min ≠ 0이면, m (xr , d )를 반환한다.
만약 greedy 가 false 이면,
z 에 c (x )를 할당한다.
z 가 failure 가 아니면 z 를 반환한다.
m (xr , d )를 반환한다.
z 에 m (xr , d )를 할당한다.
z 가 failure 가 아니면 z 를 반환한다.
c (x )를 반환한다.
참고 1
Atom 뒤에 Quantifier 가 오면,
Quantifier 가 지정한
횟수만큼 반복된다. Quantifier 는 비탐욕적일 수 있는데 이 경우
Atom 패턴을 가능한 적게 반복하며,
아니면 탐욕적일 경우 Atom 패턴을
가능한 많이 반복한다. Atom 패턴이
반복되는 것이며, 매치되는 입력 문자 시퀀스가 반복되는 것이 아니므로, Atom 의 각 반복은 서로 다른 입력 부분 문자열을 매치할 수 있다.
참고 2
Atom 와 그 뒤의 정규 표현식 모두 선택
지점이 있으면, Atom 을 먼저 가능한
많이(또는 비탐욕적이면 적게) 반복한다. 그 뒤의 모든 선택을 먼저 시도한 다음 마지막 Atom 반복의 다음 선택으로 넘어간다.
마지막(n번째 ) Atom 반복의 모든 선택이 끝나면, 그 다음은 마지막에서 두
번째(n-1)번째 Atom 반복의 다음 선택으로 넘어간다. 반복 횟수가 더 많거나 적게
가능한 경우, 위 순서대로 모두 소진한 뒤 이전 반복으로 넘어간다.
비교 예시:
/a[a-z]{2 ,4 }/.exec ("abcdefghi" )
결과는 "abcde" 이고
/a[a-z]{2 ,4 }?/.exec ("abcdefghi" )
결과는 "abc" 이다.
또한 다음을 보라:
/(aa|aabaac|ba|b|c)*/.exec ("aabaac" )
위의 선택 순서에 따라 결과 배열은
["aaba" , "ba" ]
이고, 아래는 아니다:
["aabaac" , "aabaac" ]
["aabaac" , "c" ]
위와 같은 선택 순서는 정규 표현식을 사용해 두 수의 최대공약수를 계산할 수도 있다(단항 표기 사용). 예를 들어 10과 15의 최대공약수 계산은
아래와 같다:
"aaaaaaaaaa,aaaaaaaaaaaaaaa" .replace (/^(a+)\1*,\1+$/ , "$1" )
결과는 단항 표기로 "aaaaa" 이다.
참고 3
RepeatMatcher의 4
단계는 Atom 의 캡처를 반복될 때마다
초기화한다. 아래 예시에서 그 동작을 확인할 수 있다:
/(z)((a+)?(b+)?(c))*/.exec ("zaacbbbcac" )
결과 배열은
["zaacbbbcac" , "z" , "ac" , "a" , undefined , "c" ]
이고,
["zaacbbbcac" , "z" , "ac" , "a" , "bbb" , "c" ]
는 아니다. 이는 바깥 *의 각 반복에서 수량자가 포함하는 Atom 의 모든 캡처 문자열(여기서는 2, 3, 4, 5번)이 초기화되기
때문이다.
참고 4
RepeatMatcher의 2.b 단계는 최솟값 반복을 만족한 뒤에는,
빈 문자열을 매치하는 반복은 더 이상 시도하지 않는다고 명시한다. 이는 아래와 같은 패턴에서 정규 표현식 엔진이 무한루프에 빠지는 것을
방지한다:
/(a*)*/.exec ("b" )
혹은 다음과 같이 조금 더 복잡한 경우에도:
/(a*)b\1 +/.exec ("baaaac" )
결과 배열은
["b" , "" ]
22.2.2.3.2 EmptyMatcher ( )
EmptyMatcher 추상 연산은 인수를 받지 않으며 Matcher 를 반환한다. 호출 시 다음 단계를 수행한다:
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 아무것도 캡처하지 않는 새로운
Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
c (x )를 반환한다.
22.2.2.3.3 MatchTwoAlternatives ( m1 ,
m2 )
MatchTwoAlternatives 추상 연산은 m1 (Matcher )와
m2 (Matcher )를 인수로 받아 Matcher 를 반환한다. 호출 시 다음 단계를 수행한다:
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 m1 과
m2 를 캡처하는 새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
r 에 m1 (x , c )를 할당한다.
r 가 failure 가 아니면 r 를 반환한다.
m2 (x , c )를 반환한다.
22.2.2.3.4 MatchSequence ( m1 , m2 ,
direction )
MatchSequence 추상 연산은 m1 (Matcher ), m2 (Matcher ),
direction (forward 또는 backward )를
인수로 받아 Matcher 를 반환한다. 호출 시 다음 단계를 수행한다:
만약 direction 이 forward 라면,
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며
m1 과 m2 를 캡처하는 새로운 Matcher 를
반환한다:
Assert : x 는
MatchState 이다.
Assert : c 는
MatcherContinuation 이다.
d 에 다음과 같이 호출될 때 아래 단계를 수행하는 (y ) 파라미터를 가지며
c 와 m2 를 캡처하는 새로운 MatcherContinuation 를
할당한다:
Assert :
y 는 MatchState 이다.
m2 (y , c )를 반환한다.
m1 (x , d )를 반환한다.
그 외의 경우,
Assert : direction 은
backward 이다.
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며
m1 과 m2 를 캡처하는 새로운 Matcher 를
반환한다:
Assert : x 는
MatchState 이다.
Assert : c 는
MatcherContinuation 이다.
d 에 다음과 같이 호출될 때 아래 단계를 수행하는 (y ) 파라미터를 가지며
c 와 m1 을 캡처하는 새로운 MatcherContinuation 를
할당한다:
Assert :
y 는 MatchState 이다.
m1 (y , c )를 반환한다.
m2 (x , d )를 반환한다.
22.2.2.4 실행 시 의미론: CompileAssertion
구문 지향 연산
CompileAssertion은 rer (RegExp
레코드 )를 인수로 받아 Matcher 를 반환한다.
참고 1
다음 생성식에 대해 개별적으로 정의된다:
Assertion :: ^
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 rer 를 캡처하는
새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
Input 에 x .[[Input]] 을 할당한다.
e 에 x .[[EndIndex]] 를 할당한다.
만약 e = 0이거나, rer .[[Multiline]] 가 true 이고
Input [e - 1]이 LineTerminator 에 매치되면,
c (x )를 반환한다.
failure 를 반환한다.
참고 2
y 플래그가 사용되어도, ^는 항상 Input 의 시작
또는(rer .[[Multiline]] 가 true 이면)
줄의 시작에서만 매치된다.
Assertion :: $
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 rer 를 캡처하는
새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
Input 에 x .[[Input]] 을 할당한다.
e 에 x .[[EndIndex]] 를 할당한다.
InputLength 에 Input 의 요소 개수를 할당한다.
만약 e = InputLength 이거나, rer .[[Multiline]] 가 true 이고
Input [e ]이 LineTerminator 에 매치되면,
c (x )를 반환한다.
failure 를 반환한다.
Assertion :: \b
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 rer 를 캡처하는
새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
Input 에 x .[[Input]] 을 할당한다.
e 에 x .[[EndIndex]] 를 할당한다.
a 에 IsWordChar (rer ,
Input , e - 1)을 할당한다.
b 에 IsWordChar (rer ,
Input , e )를 할당한다.
만약 a 가 true 이고 b 가
false 이거나, a 가 false 이고
b 가 true 이면 c (x )를 반환한다.
failure 를 반환한다.
Assertion :: \B
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 rer 를 캡처하는
새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
Input 에 x .[[Input]] 을 할당한다.
e 에 x .[[EndIndex]] 를 할당한다.
a 에 IsWordChar (rer ,
Input , e - 1)을 할당한다.
b 에 IsWordChar (rer ,
Input , e )를 할당한다.
만약 a 가 true 이고 b 가
true 이거나, a 가 false 이고
b 가 false 이면 c (x )를 반환한다.
failure 를 반환한다.
Assertion ::
(?=
Disjunction
)
m 에 CompileSubpattern 을 Disjunction 에
rer 와 forward 를 인수로 호출한 결과를 할당한다.
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 m 를 캡처하는
새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
d 에 아무것도 캡처하지 않고 아래 단계를 수행하는 (y ) 파라미터를 가지는 새로운
MatcherContinuation 를
할당한다:
Assert : y 는
MatchState 이다.
y 를 반환한다.
r 에 m (x , d )를 할당한다.
r 가 failure 이면
failure 를 반환한다.
Assert : r 는 MatchState 이다.
cap 에 r .[[Captures]] 를 할당한다.
Input 에 x .[[Input]] 을 할당한다.
xe 에 x .[[EndIndex]] 를 할당한다.
z 에 MatchState
{ [[Input]] : Input , [[EndIndex]] : xe , [[Captures]] : cap }를 할당한다.
c (z )를 반환한다.
참고 3
(?= Disjunction ) 형식은 0폭 양수
전방탐색을 지정한다. 성공하려면 Disjunction 내부의 패턴이 현재 위치에서 매치되어야 하지만,
현재 위치는 뒤 패턴을 매치하기 전에 이동하지 않는다. Disjunction 이 현재 위치에서 여러 방식으로 매치 가능해도 첫
번째 방식만 시도된다. 다른 정규식 연산자와 달리 (?= 형식에는 백트래킹이 없다(이런 특이한 동작은 Perl에서 유래). 이는
Disjunction 에 캡처 괄호가
있고, 패턴의 뒤에 해당 캡처를 참조하는 경우에만 영향을 미친다.
예시:
/(?=(a+))/.exec ("baaabac" )
은 첫 번째 b 바로 뒤에서 빈 문자열을 매치하고, 결과 배열은:
["" , "aaa" ]
전방탐색 내부에 백트래킹이 없음을 보여주기 위해 다음을 보라:
/(?=(a+))a*b\1 /.exec ("baaabac" )
이 식의 결과는
["aba" , "a" ]
이고, 아래는 아니다:
["aaaba" , "a" ]
Assertion ::
(?!
Disjunction
)
m 에 CompileSubpattern 을 Disjunction 에
rer 와 forward 를 인수로 호출한 결과를 할당한다.
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 m 를 캡처하는
새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
d 에 아무것도 캡처하지 않고 아래 단계를 수행하는 (y ) 파라미터를 가지는 새로운
MatcherContinuation 를
할당한다:
Assert : y 는
MatchState 이다.
y 를 반환한다.
r 에 m (x , d )를 할당한다.
r 가 failure 가 아니면
failure 를 반환한다.
c (x )를 반환한다.
참고 4
(?! Disjunction ) 형식은 0폭 음수
전방탐색을 지정한다. 성공하려면 Disjunction 내부의 패턴이 현재 위치에서 매치되지 않아야
한다. 현재 위치는 뒤 패턴을 매치하기 전에 이동하지 않는다. Disjunction 에는 캡처 괄호를 포함할 수 있는데, 이 괄호에
대한 역참조는 Disjunction
내부에서만 의미가 있다. 패턴의 다른 곳에서 이 캡처 괄호를 참조하면 항상 undefined 를 반환하므로, 음수
전방탐색이 실패해야 패턴이 성공한다. 예를 들어,
/(.*?)a (?!(a+)b\2c)\2 (.*)/.exec ("baaabaac" )
은 a 바로 뒤에 임의의 개수 n의 a, b, 그 다음 또 n개의
a(첫 번째 \2로 지정), 그리고 c가 오지 않는 a를
찾는다. 두 번째 \2는 음수 전방탐색 바깥에 있으므로 undefined 와 매치되어 항상
성공한다. 전체 표현식의 결과 배열은:
["baaabaac" , "ba" , undefined , "abaac" ]
Assertion ::
(?<=
Disjunction
)
m 에 CompileSubpattern 을 Disjunction 에
rer 와 backward 를 인수로 호출한 결과를 할당한다.
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 m 를 캡처하는
새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
d 에 아무것도 캡처하지 않고 아래 단계를 수행하는 (y ) 파라미터를 가지는 새로운
MatcherContinuation 를
할당한다:
Assert : y 는
MatchState 이다.
y 를 반환한다.
r 에 m (x , d )를 할당한다.
r 가 failure 이면
failure 를 반환한다.
Assert : r 는 MatchState 이다.
cap 에 r .[[Captures]] 를 할당한다.
Input 에 x .[[Input]] 을 할당한다.
xe 에 x .[[EndIndex]] 를 할당한다.
z 에 MatchState
{ [[Input]] : Input , [[EndIndex]] : xe , [[Captures]] : cap }를 할당한다.
c (z )를 반환한다.
Assertion ::
(?<!
Disjunction
)
m 에 CompileSubpattern 을 Disjunction 에
rer 와 backward 를 인수로 호출한 결과를 할당한다.
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 m 를 캡처하는
새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
d 에 아무것도 캡처하지 않고 아래 단계를 수행하는 (y ) 파라미터를 가지는 새로운
MatcherContinuation 를
할당한다:
Assert : y 는
MatchState 이다.
y 를 반환한다.
r 에 m (x , d )를 할당한다.
r 가 failure 가 아니면
failure 를 반환한다.
c (x )를 반환한다.
22.2.2.4.1 IsWordChar ( rer , Input ,
e )
IsWordChar 추상 연산은 rer (RegExp
레코드 ), Input (문자 List ),
e (정수 )를 인수로 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
InputLength 에 Input 의 요소 개수를 할당한다.
만약 e = -1 또는 e = InputLength 이면
false 를 반환한다.
c 에 Input [e ] 문자를 할당한다.
만약 WordCharacters (rer )에
c 가 포함되어 있으면 true 를 반환한다.
false 를 반환한다.
22.2.2.5 실행 시 의미론: CompileQuantifier
구문 지향 연산
CompileQuantifier는 인수를 받지 않으며 Record
타입의 [[Min]] (0 이상의 정수 ), [[Max]] (0 이상의 정수 또는 +∞), [[Greedy]] (Boolean) 필드를 반환한다. 다음 생성식에 대해 개별적으로 정의된다:
Quantifier ::
QuantifierPrefix
qp 에 CompileQuantifierPrefix
를 QuantifierPrefix 에 대해 호출한 결과를
할당한다.
Record { [[Min]] : qp .[[Min]] ,
[[Max]] : qp .[[Max]] ,
[[Greedy]] : true }를 반환한다.
Quantifier ::
QuantifierPrefix
?
qp 에 CompileQuantifierPrefix
를 QuantifierPrefix 에 대해 호출한 결과를
할당한다.
Record { [[Min]] : qp .[[Min]] ,
[[Max]] : qp .[[Max]] ,
[[Greedy]] : false }를 반환한다.
22.2.2.6 실행 시 의미론: CompileQuantifierPrefix
구문 지향 연산
CompileQuantifierPrefix는 인수를 받지 않으며 Record
타입의 [[Min]] (0 이상의 정수 ), [[Max]] (0 이상의 정수 또는 +∞) 필드를 반환한다. 다음
생성식에 대해 개별적으로 정의된다:
QuantifierPrefix
:: *
Record { [[Min]] : 0, [[Max]] : +∞ }를
반환한다.
QuantifierPrefix
:: +
Record { [[Min]] : 1, [[Max]] : +∞ }를
반환한다.
QuantifierPrefix
:: ?
Record { [[Min]] : 0, [[Max]] : 1 }를
반환한다.
QuantifierPrefix
::
{
DecimalDigits
}
i 에 DecimalDigits 의 MV를 할당한다(12.9.3 참고).
Record { [[Min]] : i , [[Max]] :
i }를 반환한다.
QuantifierPrefix
::
{
DecimalDigits
,}
i 에 DecimalDigits 의 MV를 할당한다.
Record { [[Min]] : i , [[Max]] :
+∞ }를 반환한다.
QuantifierPrefix
::
{
DecimalDigits
,
DecimalDigits
}
i 에 첫 번째 DecimalDigits 의 MV를 할당한다.
j 에 두 번째 DecimalDigits 의 MV를 할당한다.
Record { [[Min]] : i , [[Max]] :
j }를 반환한다.
22.2.2.7 실행 시 의미론: CompileAtom
구문 지향 연산
CompileAtom은 rer (RegExp
레코드 )와 direction (forward 또는
backward )를 인수로 받고 Matcher 를 반환한다.
참고 1
다음 생성식에 대해 개별적으로 정의된다:
Atom :: PatternCharacter
ch 에 PatternCharacter 가 매치한 문자를 할당한다.
A 에 문자 ch 를 포함하는 원소 하나짜리 CharSet 을 할당한다.
CharacterSetMatcher (rer ,
A , false , direction )을 반환한다.
Atom :: .
A 에 AllCharacters (rer )를
할당한다.
rer .[[DotAll]] 이 true 가 아니면,
A 에서 LineTerminator 생성식의 오른쪽에
해당하는 모든 코드 포인트의 문자를 제거한다.
CharacterSetMatcher (rer ,
A , false , direction )을 반환한다.
Atom :: CharacterClass
cc 에 CompileCharacterClass 를
CharacterClass 에
rer 를 인수로 호출한 결과를 할당한다.
cs 에 cc .[[CharSet]] 을 할당한다.
rer .[[UnicodeSets]] 이
false 이거나, cs 의 모든 CharSetElement 가 한 글자로만 이루어진 경우(빈
집합도 포함), CharacterSetMatcher (rer ,
cs , cc .[[Invert]] ,
direction )을 반환한다.
Assert :
cc .[[Invert]] 는 false 이다.
lm 에 List 타입의 빈
Matchers 리스트를 할당한다.
cs 의 각 CharSetElement s 에 대해,
두 글자 이상인 경우 길이가 긴 것부터 반복하여
cs2 에 s 의 마지막 코드 포인트 하나만을 포함하는 CharSet 를 할당한다.
m2 에 CharacterSetMatcher (rer ,
cs2 , false , direction )를 할당한다.
s 의 두 번째부터 마지막 앞까지의 각 코드 포인트 c1 에 대해 거꾸로 반복하여
cs1 에 c1 을 포함하는 원소 하나짜리 CharSet 를 할당한다.
m1 에 CharacterSetMatcher (rer ,
cs1 , false , direction )를
할당한다.
m2 에 MatchSequence (m1 ,
m2 , direction )를 할당한다.
m2 를 lm 에 추가한다.
singles 에 cs 의 모든 한 글자짜리 CharSetElement 만을
포함하는 CharSet 를 할당한다.
CharacterSetMatcher (rer ,
singles , false , direction )를 lm 에
추가한다.
cs 가 빈 시퀀스를 포함하면, EmptyMatcher ()를 lm 에 추가한다.
m2 에 lm 의 마지막 Matcher 를 할당한다.
lm 의 마지막 전부터 거꾸로 각 Matcher m1 에 대해 반복하여
m2 에 MatchTwoAlternatives (m1 ,
m2 )를 할당한다.
m2 를 반환한다.
Atom ::
(
GroupSpecifier opt
Disjunction
)
m 에 CompileSubpattern 를 Disjunction 에
rer 와 direction 을 인수로 호출한 결과를 할당한다.
parenIndex 에 CountLeftCapturingParensBefore (Atom )의 결과를 할당한다.
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며
direction , m , parenIndex 를 캡처하는 새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
d 에 다음과 같이 호출될 때 아래 단계를 수행하는 (y ) 파라미터를 가지며
x , c , direction , parenIndex 를
캡처하는 새로운 MatcherContinuation 를
할당한다:
Assert : y 는
MatchState 이다.
cap 에 y .[[Captures]] 의
복사본을 할당한다.
Input 에 x .[[Input]] 을
할당한다.
xe 에 x .[[EndIndex]] 를
할당한다.
ye 에 y .[[EndIndex]] 를
할당한다.
direction 이 forward 이면,
Assert : xe
≤ ye .
r 에 CaptureRange
{ [[StartIndex]] : xe ,
[[EndIndex]] : ye }를
할당한다.
그 외의 경우,
Assert :
direction 이 backward 임을
확인한다.
Assert : ye
≤ xe .
r 에 CaptureRange
{ [[StartIndex]] : ye ,
[[EndIndex]] : xe }를
할당한다.
cap [parenIndex + 1]에 r 를 할당한다.
z 에 MatchState { [[Input]] : Input , [[EndIndex]] : ye , [[Captures]] : cap }를 할당한다.
c (z )를 반환한다.
m (x , d )를 반환한다.
참고 2
( Disjunction ) 형태의 괄호는
Disjunction 패턴의
구성요소를 하나로 그룹화함과 동시에 매치 결과를 저장하는 역할을 한다. 매치 결과는 역참조(\ 다음에 0이 아닌 10진수),
치환 문자열에서 참조, 또는 정규표현식 매칭 Abstract Closure 의 배열로 반환될 수 있다.
괄호의 캡처 동작을 방지하려면 (?: Disjunction
) 형태를 사용한다.
Atom ::
(?
RegularExpressionModifiers
:
Disjunction
)
addModifiers 에 source text
matched by RegularExpressionModifiers 를
할당한다.
removeModifiers 에 빈 문자열을 할당한다.
modifiedRer 에 UpdateModifiers (rer ,
CodePointsToString (addModifiers ),
removeModifiers )를 할당한다.
CompileSubpattern 을 Disjunction 에
modifiedRer 와 direction 을 인수로 호출한 결과를 반환한다.
Atom ::
(?
RegularExpressionModifiers
-
RegularExpressionModifiers
:
Disjunction
)
addModifiers 에 source text
matched by 첫 번째 RegularExpressionModifiers 를
할당한다.
removeModifiers 에 source text
matched by 두 번째 RegularExpressionModifiers 를
할당한다.
modifiedRer 에 UpdateModifiers (rer ,
CodePointsToString (addModifiers ),
CodePointsToString (removeModifiers ))를
할당한다.
CompileSubpattern 을 Disjunction 에
modifiedRer 와 direction 을 인수로 호출한 결과를 반환한다.
AtomEscape ::
DecimalEscape
n 에 CapturingGroupNumber
of DecimalEscape 를
할당한다.
Assert :
n ≤ rer .[[CapturingGroupsCount]] 임을
확인한다.
BackreferenceMatcher (rer ,
« n », direction )을 반환한다.
참고 3
\ 뒤에 0이 아닌 10진수가 오는 이스케이프 시퀀스 n 은 n 번째 캡처 괄호의 매치
결과(22.2.2.1 )와 매치된다. 정규표현식에
n 개 미만의 캡처 괄호가 있으면 오류이다. 정규표현식에 n 개 이상의 캡처 괄호가 있지만
n 번째가 아무것도 캡처하지 않아 undefined 인 경우, 역참조는 항상 성공한다.
AtomEscape ::
CharacterEscape
cv 에 CharacterValue
of CharacterEscape 를 할당한다.
ch 에 문자값이 cv 인 문자를 할당한다.
A 에 문자 ch 를 포함하는 원소 하나짜리 CharSet 를 할당한다.
CharacterSetMatcher (rer ,
A , false , direction )을 반환한다.
AtomEscape ::
CharacterClassEscape
cs 에 CompileToCharSet 를 CharacterClassEscape 에
rer 를 인수로 호출한 결과를 할당한다.
rer .[[UnicodeSets]] 가
false 이거나, cs 의 모든 CharSetElement 가 한 글자만으로 이루어진
경우(빈 집합 포함), CharacterSetMatcher (rer ,
cs , false , direction )을 반환한다.
lm 에 List 타입의 빈
Matchers 리스트를 할당한다.
cs 의 각 두 글자 이상 CharSetElement s 에 대해,
길이 내림차순으로 반복하여
cs2 에 s 의 마지막 코드 포인트 하나만을 포함하는 CharSet 를 할당한다.
m2 에 CharacterSetMatcher (rer ,
cs2 , false , direction )를 할당한다.
s 의 두 번째부터 마지막 앞까지의 각 코드 포인트 c1 에 대해 거꾸로 반복하여
cs1 에 c1 을 포함하는 원소 하나짜리 CharSet 를 할당한다.
m1 에 CharacterSetMatcher (rer ,
cs1 , false , direction )를
할당한다.
m2 에 MatchSequence (m1 ,
m2 , direction )를 할당한다.
m2 를 lm 에 추가한다.
singles 에 cs 의 모든 한 글자짜리 CharSetElement 만을
포함하는 CharSet 를 할당한다.
CharacterSetMatcher (rer ,
singles , false , direction )를 lm 에
추가한다.
cs 가 빈 시퀀스를 포함하면, EmptyMatcher ()를 lm 에 추가한다.
m2 에 lm 의 마지막 Matcher 를 할당한다.
lm 의 마지막 전부터 거꾸로 각 Matcher m1 에 대해 반복하여
m2 에 MatchTwoAlternatives (m1 ,
m2 )를 할당한다.
m2 를 반환한다.
AtomEscape ::
k
GroupName
matchingGroupSpecifiers 에 GroupSpecifiersThatMatch (GroupName )를 할당한다.
parenIndices 에 List 타입의 빈
리스트를 할당한다.
matchingGroupSpecifiers 의 각 GroupSpecifier
groupSpecifier 에 대해 반복하여
parenIndex 에 CountLeftCapturingParensBefore (groupSpecifier )의
결과를 할당한다.
parenIndex 를 parenIndices 에 추가한다.
BackreferenceMatcher (rer ,
parenIndices , direction )를 반환한다.
22.2.2.7.1 CharacterSetMatcher ( rer ,
A , invert , direction )
CharacterSetMatcher 추상 연산은 rer (RegExp
레코드 ), A (CharSet ),
invert (Boolean), direction (forward 또는
backward )를 인수로 받고 Matcher 를 반환한다. 호출 시 다음 단계를
수행한다:
rer .[[UnicodeSets]] 가
true 이면,
Assert : invert 는
false 임을 확인한다.
Assert : A 의 모든 CharSetElement 는 한
글자만으로 이루어져 있어야 한다.
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 rer ,
A , invert , direction 를 캡처하는 새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
Input 에 x .[[Input]] 을 할당한다.
e 에 x .[[EndIndex]] 를 할당한다.
direction 이 forward 이면 f 에
e + 1을 할당한다.
그 외의 경우 f 에 e - 1을 할당한다.
InputLength 에 Input 의 요소 개수를 할당한다.
f < 0 또는 f > InputLength 이면
failure 를 반환한다.
index 에 min (e , f )를
할당한다.
ch 에 Input [index ] 문자를 할당한다.
cc 에 Canonicalize (rer ,
ch )를 할당한다.
A 에 한 글자만 가진 CharSetElement
a 가 존재하며, Canonicalize (rer ,
a ) == cc 이면 found 를
true 로, 아니면 false 로 한다.
invert 가 false 이고 found 가
false 이면 failure 를 반환한다.
invert 가 true 이고 found 가
true 이면 failure 를 반환한다.
cap 에 x .[[Captures]] 를
할당한다.
y 에 MatchState { [[Input]] : Input , [[EndIndex]] : f , [[Captures]] : cap }를 할당한다.
c (y )를 반환한다.
22.2.2.7.2 BackreferenceMatcher ( rer ,
ns , direction )
BackreferenceMatcher 추상 연산은 rer (RegExp
레코드 ), ns (양의 List 타입의 정수 ),
direction (forward 또는
backward )를 인수로 받고 Matcher 를 반환한다. 호출 시 다음 단계를
수행한다:
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 rer ,
ns , direction 를 캡처하는 새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
Input 에 x .[[Input]] 을 할당한다.
cap 에 x .[[Captures]] 를
할당한다.
r 에 undefined 를 할당한다.
ns 의 각 정수 n 에 대해 반복하여
cap [n ]이 undefined 가 아니면,
Assert :
r 는 undefined 이어야 한다.
r 에 cap [n ]을 할당한다.
r 가 undefined 이면 c (x )를
반환한다.
e 에 x .[[EndIndex]] 를 할당한다.
rs 에 r .[[StartIndex]] 를
할당한다.
re 에 r .[[EndIndex]] 를 할당한다.
len 에 re - rs 를 할당한다.
direction 이 forward 이면 f 에
e + len 을 할당한다.
그 외의 경우 f 에 e - len 을 할당한다.
InputLength 에 Input 의 요소 개수를 할당한다.
f < 0 또는 f > InputLength 이면
failure 를 반환한다.
g 에 min (e , f )를
할당한다.
0(포함)부터 len (미포함)까지 interval 에서 각
정수 i 에 대해, Canonicalize (rer ,
Input [rs + i ])와 Canonicalize (rer ,
Input [g + i ])가 다르면
failure 를 반환한다.
y 에 MatchState { [[Input]] : Input , [[EndIndex]] : f , [[Captures]] : cap }를 할당한다.
c (y )를 반환한다.
22.2.2.7.3 Canonicalize ( rer , ch )
Canonicalize 추상 연산은 rer (RegExp
레코드 )와 ch (문자)를 인수로 받아 문자를 반환한다. 호출 시 다음 단계를 수행한다:
HasEitherUnicodeFlag (rer )
이 true 이고 rer .[[IgnoreCase]] 가 true 이면,
Unicode Character Database의 CaseFolding.txt
파일이 ch 에 대해 simple 또는 common case folding 매핑을 제공하면, 그 매핑을 적용한
결과를 반환한다.
ch 를 반환한다.
rer .[[IgnoreCase]] 가
false 이면 ch 를 반환한다.
Assert : ch 는 UTF-16 코드 유닛이어야 한다.
cp 에 ch 의 숫자값을 가진 코드 포인트를 할당한다.
u 에 Unicode Default Case Conversion 알고리즘에 따라 toUppercase(«
cp »)를 할당한다.
uStr 에 CodePointsToString (u )를
할당한다.
uStr 의 길이가 1이 아니면 ch 를 반환한다.
cu 에 uStr 의 단일 코드 유닛을 할당한다.
ch 의 숫자값이 128 이상이고 cu 의 숫자값이 128 미만이면 ch 를 반환한다.
cu 를 반환한다.
참고
HasEitherUnicodeFlag (rer )
가 true 인 대소문자 구분 없는 매치에서는, 모든 문자가 비교 직전에 Unicode 표준이 제공하는
simple 매핑으로 암묵적으로 케이스 폴딩된다. simple 매핑은 항상 단일 코드 포인트로 매핑하므로, 예를 들어
ß(U+00DF)는 ss 또는 SS로 매핑되지 않는다. 그러나 Basic
Latin 블록 밖의 코드 포인트를 그 안으로 매핑할 수 있다—예를 들어 ſ(U+017F)는
s(U+0073)로, K(U+212A)는 k(U+006B)로 케이스
폴딩된다. 이런 코드 포인트를 포함한 문자열은 /[a-z]/ui 같은 정규표현식으로 매치된다.
HasEitherUnicodeFlag (rer )
가 false 인 대소문자 구분 없는 매치에서는, 매핑이 toCasefold가 아니라 Unicode
Default Case Conversion 알고리즘의 toUppercase 기반이라서 미묘한 차이가 있다. 예를 들어
Ω(U+2126 OHM SIGN)은 toUppercase에선 자기 자신이지만 toCasefold에선
ω(U+03C9 GREEK SMALL LETTER OMEGA)와 Ω(U+03A9 GREEK
CAPITAL LETTER OMEGA)와 함께 매핑되므로, "\u2126" 는
/[ω]/ui와 /[\u03A9]/ui로는 매치되지만 /[ω]/i나
/[\u03A9]/i로는 매치되지 않는다. 또한 Basic Latin 블록 밖의 코드 포인트는 그 안으로 매핑되지
않으므로, "\u017F ſ" 와 "\u212A K" 같은 문자열은
/[a-z]/i로 매치되지 않는다.
22.2.2.7.4 UpdateModifiers ( rer , add ,
remove )
UpdateModifiers 추상 연산은 rer (RegExp
레코드 ), add (문자열), remove (문자열)를 인수로 받아
RegExp 레코드 를 반환한다. 호출 시 다음 단계를 수행한다:
Assert : add 와
remove 는 공통되는 요소가 없어야 한다.
ignoreCase 에 rer .[[IgnoreCase]] 를
할당한다.
multiline 에 rer .[[Multiline]] 를
할당한다.
dotAll 에 rer .[[DotAll]] 를 할당한다.
unicode 에 rer .[[Unicode]] 를 할당한다.
unicodeSets 에 rer .[[UnicodeSets]] 를
할당한다.
capturingGroupsCount 에 rer .[[CapturingGroupsCount]] 를 할당한다.
remove 에 "i" 가 포함되어 있으면 ignoreCase 를
false 로 설정한다.
그 외 add 에 "i" 가 포함되어 있으면 ignoreCase 를
true 로 설정한다.
remove 에 "m" 가 포함되어 있으면 multiline 을
false 로 설정한다.
그 외 add 에 "m" 가 포함되어 있으면 multiline 을
true 로 설정한다.
remove 에 "s" 가 포함되어 있으면 dotAll 을
false 로 설정한다.
그 외 add 에 "s" 가 포함되어 있으면 dotAll 을
true 로 설정한다.
RegExp 레코드 { [[IgnoreCase]] : ignoreCase , [[Multiline]] : multiline , [[DotAll]] : dotAll , [[Unicode]] : unicode , [[UnicodeSets]] : unicodeSets , [[CapturingGroupsCount]] :
capturingGroupsCount }를 반환한다.
22.2.2.8 실행 시 의미론: CompileCharacterClass
구문 지향 연산
CompileCharacterClass는 rer (RegExp 레코드 )를 인수로 받고
Record 타입의 [[CharSet]] (CharSet ), [[Invert]] (Boolean) 필드를 반환한다. 다음 생성식에 대해 개별적으로 정의된다:
CharacterClass ::
[
ClassContents
]
A 에 CompileToCharSet 를 ClassContents 에
rer 를 인수로 호출한 결과를 할당한다.
Record { [[CharSet]] : A , [[Invert]] : false }를 반환한다.
CharacterClass ::
[^
ClassContents
]
A 에 CompileToCharSet 를 ClassContents 에
rer 를 인수로 호출한 결과를 할당한다.
rer .[[UnicodeSets]] 가
true 이면,
Record
{ [[CharSet]] : CharacterComplement (rer ,
A ), [[Invert]] :
false }를 반환한다.
Record { [[CharSet]] : A , [[Invert]] : true }를 반환한다.
22.2.2.9 실행 시 의미론: CompileToCharSet
구문 지향 연산
CompileToCharSet은 rer (RegExp
레코드 )를 인수로 받고 CharSet 를 반환한다.
참고 1
다음 생성식에 대해 개별적으로 정의된다:
ClassContents ::
[empty]
빈 CharSet 을 반환한다.
NonemptyClassRanges
::
ClassAtom
NonemptyClassRangesNoDash
A 에 CompileToCharSet 를 ClassAtom 에
rer 를 인수로 호출한 결과를 할당한다.
B 에 CompileToCharSet 를 NonemptyClassRangesNoDash 에
rer 를 인수로 호출한 결과를 할당한다.
A 와 B 의 CharSet 합집합을 반환한다.
NonemptyClassRanges
::
ClassAtom
-
ClassAtom
ClassContents
A 에 첫 번째 CompileToCharSet 를 ClassAtom 에
rer 를 인수로 호출한 결과를 할당한다.
B 에 두 번째 CompileToCharSet 를 ClassAtom 에
rer 를 인수로 호출한 결과를 할당한다.
C 에 CompileToCharSet 를 ClassContents 에
rer 를 인수로 호출한 결과를 할당한다.
D 에 CharacterRange (A ,
B )의 결과를 할당한다.
D 와 C 의 합집합을 반환한다.
NonemptyClassRangesNoDash
::
ClassAtomNoDash
NonemptyClassRangesNoDash
A 에 CompileToCharSet 를 ClassAtomNoDash 에
rer 를 인수로 호출한 결과를 할당한다.
B 에 CompileToCharSet 를 NonemptyClassRangesNoDash 에
rer 를 인수로 호출한 결과를 할당한다.
A 와 B 의 CharSet 합집합을 반환한다.
NonemptyClassRangesNoDash
::
ClassAtomNoDash
-
ClassAtom
ClassContents
A 에 CompileToCharSet 를 ClassAtomNoDash 에
rer 를 인수로 호출한 결과를 할당한다.
B 에 CompileToCharSet 를 ClassAtom 에
rer 를 인수로 호출한 결과를 할당한다.
C 에 CompileToCharSet 를 ClassContents 에
rer 를 인수로 호출한 결과를 할당한다.
D 에 CharacterRange (A ,
B )의 결과를 할당한다.
D 와 C 의 합집합을 반환한다.
참고 2
ClassContents 는 한
개의 ClassAtom 또는 대시로
구분된 두 개의 ClassAtom 의
범위로 확장될 수 있다. 후자의 경우 ClassContents 는 첫 번째 ClassAtom 와 두 번째 ClassAtom 사이의 모든 문자를(양끝
포함) 포함한다. 만약 ClassAtom 중 하나가 한 글자가 아니거나(예: \w) 첫 번째
ClassAtom 의 문자값이 두 번째
ClassAtom 의 문자값보다 크면
오류가 발생한다.
참고 3
패턴이 대소문자를 무시하더라도, 범위의 양 끝의 대소문자는 범위에 포함될 문자를 결정하는 데 중요하다. 예를 들어,
/[E-F]/i는 E, F, e,
f만 매치하고, /[E-f]/i는 유니코드 Basic Latin 블록의 모든 대문자·소문자와
[, \, ], ^, _,
` 기호까지 모두 매치한다.
참고 4
- 문자는 리터럴로 처리되거나 범위를 나타낼 수 있다. ClassContents 의 첫 글자 또는 마지막 글자, 범위
명세의 시작 또는 끝, 또는 범위 명세 직후에 오면 리터럴로 처리된다.
ClassAtom :: -
문자 - U+002D(HYPHEN-MINUS)만을 포함하는 CharSet 을 반환한다.
ClassAtomNoDash
:: SourceCharacter
but not one of \ or ] or
-
CharSet 에 SourceCharacter 가 매치한 문자를 포함하여
반환한다.
ClassEscape ::
b
-
CharacterEscape
cv 에 이 CharacterValue
of ClassEscape 의 값을
할당한다.
c 에 문자값이 cv 인 문자를 할당한다.
c 만을 포함하는 CharSet 을 반환한다.
참고 5
ClassAtom 에서는 정규표현식의
나머지 부분에서 허용되는 모든 이스케이프 시퀀스를 사용할 수 있지만 \b, \B, 역참조는 제외한다.
CharacterClass
내부에서 \b는 백스페이스 문자이고 \B 및 역참조는 오류를 발생시킨다. ClassAtom 안에서 역참조를 사용하면
오류가 발생한다.
CharacterClassEscape
:: d
다음 10개 문자 0, 1, 2, 3,
4, 5, 6, 7, 8,
9를 포함하는 CharSet 을 반환한다.
CharacterClassEscape
:: D
S 에 아래 CharSet 을 할당한다:
CharacterClassEscape
:: d
.
CharacterComplement (rer ,
S )를 반환한다.
CharacterClassEscape
:: s
CharSet 에 WhiteSpace 또는 LineTerminator 생성식의
오른쪽에 해당하는 모든 코드 포인트 문자를 포함하여 반환한다.
CharacterClassEscape
:: S
S 에 아래 CharSet 을 할당한다:
CharacterClassEscape
:: s
.
CharacterComplement (rer ,
S )를 반환한다.
CharacterClassEscape
:: w
MaybeSimpleCaseFolding (rer ,
WordCharacters (rer ))를
반환한다.
CharacterClassEscape
:: W
S 에 아래 CharSet 을 할당한다:
CharacterClassEscape
:: w
.
CharacterComplement (rer ,
S )를 반환한다.
CharacterClassEscape
::
p{
UnicodePropertyValueExpression
}
CompileToCharSet 를 UnicodePropertyValueExpression 에
rer 를 인수로 호출한 결과를 반환한다.
CharacterClassEscape
::
P{
UnicodePropertyValueExpression
}
S 에 CompileToCharSet 를 UnicodePropertyValueExpression 에
rer 를 인수로 호출한 결과를 할당한다.
Assert :
S 는 단일 코드 포인트만을 포함해야 한다.
CharacterComplement (rer ,
S )를 반환한다.
UnicodePropertyValueExpression
::
UnicodePropertyName
=
UnicodePropertyValue
ps 에 source text
matched by UnicodePropertyName 를 할당한다.
p 에 UnicodeMatchProperty (rer ,
ps )를 할당한다.
Assert :
p 는 Unicode property name 또는 Table 69 의
“Property name and aliases” 컬럼에 있는 property alias이어야 한다.
vs 에 source text
matched by UnicodePropertyValue 를 할당한다.
v 에 UnicodeMatchPropertyValue (p ,
vs )를 할당한다.
A 에 p 속성 값이 v 인 모든 유니코드 코드 포인트를 포함하는 CharSet 를 할당한다.
MaybeSimpleCaseFolding (rer ,
A )를 반환한다.
UnicodePropertyValueExpression
:: LoneUnicodePropertyNameOrValue
s 에 source text
matched by LoneUnicodePropertyNameOrValue 를
할당한다.
UnicodeMatchPropertyValue (General_Category,
s )가 PropertyValueAliases.txt 에
있는 General_Category(gc) 속성의 유니코드 property value 또는 property value alias이면,
속성이 “General_Category”이고 값이 s 인 모든 유니코드 코드 포인트를 포함하는 CharSet 를 반환한다.
p 에 UnicodeMatchProperty (rer ,
s )를 할당한다.
Assert :
p 는 Table 70 의 “Property
name and aliases” 컬럼에 있는 바이너리 유니코드 속성 또는 바이너리 속성 alias이거나, Table
71 의 “Property name” 컬럼에 있는 문자열 바이너리 유니코드 속성이어야 한다.
A 에 속성 p 값이 “True”인 CharSetElement를 모두 포함하는 CharSet 를 할당한다.
MaybeSimpleCaseFolding (rer ,
A )를 반환한다.
ClassUnion ::
ClassSetRange
ClassUnion opt
A 에 CompileToCharSet 를 ClassSetRange 에
rer 를 인수로 호출한 결과를 할당한다.
ClassUnion 가 존재하면,
B 에 CompileToCharSet 를
ClassUnion 에
rer 를 인수로 호출한 결과를 할당한다.
A 와 B 의 CharSet 합집합을
반환한다.
A 를 반환한다.
ClassUnion ::
ClassSetOperand
ClassUnion opt
A 에 CompileToCharSet 를 ClassSetOperand 에
rer 를 인수로 호출한 결과를 할당한다.
ClassUnion 가 존재하면,
B 에 CompileToCharSet 를
ClassUnion 에
rer 를 인수로 호출한 결과를 할당한다.
A 와 B 의 CharSet 합집합을
반환한다.
A 를 반환한다.
ClassIntersection
::
ClassSetOperand
&&
ClassSetOperand
A 에 첫 번째 CompileToCharSet 를 ClassSetOperand 에
rer 를 인수로 호출한 결과를 할당한다.
B 에 두 번째 CompileToCharSet 를 ClassSetOperand 에
rer 를 인수로 호출한 결과를 할당한다.
A 와 B 의 CharSet 교집합을 반환한다.
ClassIntersection
::
ClassIntersection
&&
ClassSetOperand
A 에 CompileToCharSet 를 ClassIntersection 에
rer 를 인수로 호출한 결과를 할당한다.
B 에 CompileToCharSet 를 ClassSetOperand 에
rer 를 인수로 호출한 결과를 할당한다.
A 와 B 의 CharSet 교집합을 반환한다.
ClassSubtraction
::
ClassSetOperand
--
ClassSetOperand
A 에 첫 번째 CompileToCharSet 를 ClassSetOperand 에
rer 를 인수로 호출한 결과를 할당한다.
B 에 두 번째 CompileToCharSet 를 ClassSetOperand 에
rer 를 인수로 호출한 결과를 할당한다.
A 에서 B 에도 포함되지 않는 CharSetElement만 포함하는 CharSet 을 반환한다.
ClassSubtraction
::
ClassSubtraction
--
ClassSetOperand
A 에 CompileToCharSet 를 ClassSubtraction 에
rer 를 인수로 호출한 결과를 할당한다.
B 에 CompileToCharSet 를 ClassSetOperand 에
rer 를 인수로 호출한 결과를 할당한다.
A 에서 B 에도 포함되지 않는 CharSetElement만 포함하는 CharSet 을 반환한다.
ClassSetRange ::
ClassSetCharacter
-
ClassSetCharacter
A 에 첫 번째 CompileToCharSet 를 ClassSetCharacter 에
rer 를 인수로 호출한 결과를 할당한다.
B 에 두 번째 CompileToCharSet 를 ClassSetCharacter 에
rer 를 인수로 호출한 결과를 할당한다.
MaybeSimpleCaseFolding (rer ,
CharacterRange (A ,
B ))를 반환한다.
참고 6
결과는 종종 두 개 이상의 범위로 구성된다. UnicodeSets가 true 이고 IgnoreCase가
true 인 경우, MaybeSimpleCaseFolding (rer ,
[Ā-č])는 해당 범위의 홀수 코드 포인트만 포함하게 된다.
ClassSetOperand
:: ClassSetCharacter
A 에 CompileToCharSet 를 ClassSetCharacter
에 rer 를 인수로 호출한 결과를 할당한다.
MaybeSimpleCaseFolding (rer ,
A )를 반환한다.
ClassSetOperand
:: ClassStringDisjunction
A 에 CompileToCharSet 를 ClassStringDisjunction 에
rer 를 인수로 호출한 결과를 할당한다.
MaybeSimpleCaseFolding (rer ,
A )를 반환한다.
ClassSetOperand
:: NestedClass
CompileToCharSet 를 NestedClass 에
rer 를 인수로 호출한 결과를 반환한다.
NestedClass ::
[
ClassContents
]
CompileToCharSet 를 ClassContents 에
rer 를 인수로 호출한 결과를 반환한다.
NestedClass ::
[^
ClassContents
]
A 에 CompileToCharSet 를 ClassContents 에
rer 를 인수로 호출한 결과를 할당한다.
CharacterComplement (rer ,
A )를 반환한다.
NestedClass ::
\
CharacterClassEscape
CompileToCharSet 를 CharacterClassEscape 에
rer 를 인수로 호출한 결과를 반환한다.
ClassStringDisjunction
::
\q{
ClassStringDisjunctionContents
}
CompileToCharSet 를 ClassStringDisjunctionContents
에 rer 를 인수로 호출한 결과를 반환한다.
ClassStringDisjunctionContents
:: ClassString
s 에 CompileClassSetString 를
ClassString 에
rer 를 인수로 호출한 결과를 할당한다.
문자열 s 하나만 포함하는 CharSet 을 반환한다.
ClassStringDisjunctionContents
::
ClassString
|
ClassStringDisjunctionContents
s 에 CompileClassSetString 를
ClassString 에
rer 를 인수로 호출한 결과를 할당한다.
A 에 문자열 s 하나만 포함하는 CharSet 를 할당한다.
B 에 CompileToCharSet 를 ClassStringDisjunctionContents
에 rer 를 인수로 호출한 결과를 할당한다.
A 와 B 의 CharSet 합집합을 반환한다.
ClassSetCharacter
::
SourceCharacter
but not ClassSetSyntaxCharacter
\
CharacterEscape
\
ClassSetReservedPunctuator
cv 에 이 CharacterValue
of ClassSetCharacter 의 값을 할당한다.
c 에 문자값이 cv 인 문자를 할당한다.
c 만을 포함하는 CharSet 을 반환한다.
ClassSetCharacter
:: \b
U+0008(BACKSPACE) 문자 하나만 포함하는 CharSet 을 반환한다.
22.2.2.9.1 CharacterRange ( A , B )
CharacterRange 추상 연산은 A (CharSet ), B (CharSet )를 인수로 받고 CharSet 를 반환한다. 호출 시 다음 단계를 수행한다:
Assert : A 와 B 는 각각 정확히
하나의 문자를 포함해야 한다.
a 에 CharSet
A 의 단일 문자를 할당한다.
b 에 CharSet
B 의 단일 문자를 할당한다.
i 에 문자 a 의 문자값을 할당한다.
j 에 문자 b 의 문자값을 할당한다.
Assert : i ≤ j 임을
확인한다.
i 부터 j 까지 포함 구간 에 속하는 모든
문자값의 문자를 포함하는 CharSet 을 반환한다.
22.2.2.9.2 HasEitherUnicodeFlag ( rer )
HasEitherUnicodeFlag 추상 연산은 rer (RegExp
레코드 )를 인수로 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
rer .[[Unicode]] 가
true 이거나 rer .[[UnicodeSets]] 가 true 이면,
true 를 반환한다.
false 를 반환한다.
22.2.2.9.3 WordCharacters ( rer )
WordCharacters 추상 연산은 rer (RegExp
레코드 )를 인수로 받고 CharSet 를 반환한다. \b,
\B, \w, \W에 대해 "단어 문자"로 간주되는 문자를 포함하는 CharSet 을 반환한다. 호출 시 다음 단계를 수행한다:
basicWordChars 에 CharSet 을 할당한다. ASCII 단어 문자 의 모든 문자를 포함한다.
extraWordChars 에 CharSet 을 할당한다. c 가
basicWordChars 에는 없지만 Canonicalize (rer ,
c )가 basicWordChars 에 포함되는 모든 문자 c 를 포함한다.
Assert : extraWordChars 는
HasEitherUnicodeFlag (rer )
가 true 이고 rer .[[IgnoreCase]] 가 true 일 때가 아니면 비어 있어야
한다.
basicWordChars 와 extraWordChars 의 합집합을 반환한다.
22.2.2.9.4 AllCharacters ( rer )
AllCharacters 추상 연산은 rer (RegExp
레코드 )를 인수로 받고 CharSet 를 반환한다. 정규표현식 플래그에 따라 “모든 문자” 집합을
반환한다. 호출 시 다음 단계를 수행한다:
rer .[[UnicodeSets]] 가
true 이고 rer .[[IgnoreCase]] 가 true 이면,
Simple
Case Folding 매핑이 없는(scf (c )=c )
모든 유니코드 코드 포인트 c 를 포함하는 CharSet 을
반환한다.
그 외 HasEitherUnicodeFlag (rer )
가 true 이면,
모든 코드 포인트 값을 포함하는 CharSet 을 반환한다.
그 외,
모든 코드 유닛 값을 포함하는 CharSet 을 반환한다.
22.2.2.9.5 MaybeSimpleCaseFolding ( rer ,
A )
MaybeSimpleCaseFolding 추상 연산은 rer (RegExp
레코드 )와 A (CharSet )를 인수로 받아 CharSet 를 반환한다. rer .[[UnicodeSets]] 가 false 이거나 rer .[[IgnoreCase]] 가 false 이면 A 를 반환한다.
그렇지 않으면 Simple Case
Folding (scf(cp ) ) 정의를 CaseFolding.txt
파일에서 가져와서(각각 단일 코드 포인트를 다른 단일 코드 포인트로 매핑) A 의 각 CharSetElement 를 문자 단위로 정규화 형태로 변환하여,
그 결과 CharSet 를 반환한다. 호출 시 다음 단계를 수행한다:
rer .[[UnicodeSets]] 가
false 이거나 rer .[[IgnoreCase]] 가 false 이면 A 를
반환한다.
B 에 새 빈 CharSet 을 할당한다.
A 의 각 CharSetElement s 에
대해 반복하여
t 에 빈 문자 시퀀스를 할당한다.
s 의 각 단일 코드 포인트 cp 에 대해 반복하여
scf (cp )를
t 에 추가한다.
t 를 B 에 추가한다.
B 를 반환한다.
22.2.2.9.6 CharacterComplement ( rer ,
S )
CharacterComplement 추상 연산은 rer (RegExp
레코드 )와 S (CharSet )를 인수로 받아 CharSet 를 반환한다. 호출 시 다음 단계를 수행한다:
A 에 AllCharacters (rer )를
할당한다.
A 에 포함되지만 S 에는 포함되지 않는 CharSetElement만 포함하는 CharSet 을 반환한다.
22.2.2.9.7 UnicodeMatchProperty ( rer ,
p )
UnicodeMatchProperty 추상 연산은 rer (RegExp
레코드 )와 p (ECMAScript 소스 텍스트 )
를 인수로 받아 유니코드 속성 이름 을 반환한다. 호출 시 다음 단계를 수행한다:
rer .[[UnicodeSets]] 가
true 이고 p 가 표 71 의
“속성 이름” 열에 있는 유니코드 속성 이름 이면,
유니코드 코드 포인트 p 의 List 를
반환한다.
Assert : p 는 표 69 또는
표 70 의 “속성 이름 및
별칭” 열에 있는 유니코드 속성 이름 또는 속성 별칭이어야 한다.
c 에 해당 행의 “표준 속성 이름 ” 열에 있는 p 의 표준
속성 이름 을 할당한다.
유니코드 코드 포인트 c 의 List 를
반환한다.
구현체는 표 69 , 표 70 , 표 71 에 나열된 유니코드
속성 이름과 별칭을 반드시 지원해야 한다. 상호운용성을 보장하기 위해, 구현체는 그 밖의 속성 이름이나 별칭을 지원해서는 안 된다.
참고 1
예를 들어, Script_Extensions(속성 이름 ) 및
scx(속성 별칭)는 유효하지만, script_extensions나
Scx는 유효하지 않다.
참고 2
나열된 속성은 UTS18 RL1.2 가 요구하는
것보다 더 넓은 집합을 이룬다.
참고 3
이 표의 항목(대소문자 포함) 철자는 유니코드 문자 데이터베이스의 PropertyAliases.txt
파일에서 사용되는 철자와 일치한다. 해당 파일의 정확한 철자는 변경되지
않을 것 이 보장된다.
표 69: 비이진 유니코드 속성 별칭과 표준 속성 이름
표 70: 이진 유니코드 속성 별칭과 표준 속성 이름
표 71: 문자열의 이진 유니코드 속성
속성 이름
Basic_Emoji
Emoji_Keycap_Sequence
RGI_Emoji_Modifier_Sequence
RGI_Emoji_Flag_Sequence
RGI_Emoji_Tag_Sequence
RGI_Emoji_ZWJ_Sequence
RGI_Emoji
22.2.2.9.8 UnicodeMatchPropertyValue ( p ,
v )
UnicodeMatchPropertyValue 추상 연산은 p (ECMAScript 소스 텍스트 )와
v (ECMAScript 소스 텍스트 )
를 인수로 받아 유니코드 속성 값을 반환한다. 호출 시 다음 단계를 수행한다:
Assert : p 는 표 69 의 “표준 속성
이름” 열에 나열된 표준, 별칭 없는 유니코드 속성 이름 이어야 한다.
Assert : v 는 PropertyValueAliases.txt 에
p 유니코드 속성에 대해 나열된 속성 값 또는 속성 값 별칭이어야 한다.
value 에 해당 행의 “표준 속성 값” 열에 있는 v 의 표준 속성 값을 할당한다.
유니코드 코드 포인트 value 의 List 를
반환한다.
구현체는 표 69 에 나열된 속성에 대해 PropertyValueAliases.txt 에
나열된 유니코드 속성 값과 속성 값 별칭을 반드시 지원해야 한다. 상호운용성을 보장하기 위해, 그 밖의 속성 값이나 속성 값 별칭을 지원해서는 안 된다.
참고 1
예를 들어, Xpeo와 Old_Persian는
Script_Extensions의 유효한 값이지만 xpeo와
Old Persian는 유효하지 않다.
참고 2
이 알고리즘은 UAX44의 상징값
매칭 규칙 과 다르다: 대소문자, 공백 , U+002D(HYPHEN-MINUS),
U+005F(LOW LINE)은 무시되지 않으며, Is 접두사도 지원하지 않는다.
22.2.2.10 실행 시 의미론: CompileClassSetString
구문 지향 연산
CompileClassSetString은 rer (RegExp 레코드 )를 인수로 받아 문자 시퀀스를
반환한다. 다음 생성식에 대해 개별적으로 정의된다:
ClassString ::
[empty]
빈 문자 시퀀스를 반환한다.
ClassString ::
NonEmptyClassString
CompileClassSetString 를
NonEmptyClassString 에
rer 를 인수로 호출한 결과를 반환한다.
NonEmptyClassString
::
ClassSetCharacter
NonEmptyClassString opt
cs 에 CompileToCharSet 를 ClassSetCharacter 에
rer 를 인수로 호출한 결과를 할당한다.
s1 에 cs 의 단일 CharSetElement 로
이루어진 문자 시퀀스를 할당한다.
NonEmptyClassString 가 존재하면,
s2 에 CompileClassSetString 를
NonEmptyClassString 에
rer 를 인수로 호출한 결과를 할당한다.
s1 과 s2 를 연결한 값을 반환한다.
s1 를 반환한다.
22.2.3 RegExp 생성에 대한 추상 연산
22.2.3.1 RegExpCreate ( P , F )
추상 연산 RegExpCreate는 P (ECMAScript 언어
값 )와
F (문자열 또는 undefined )를 인수로 받고, 값 완료(normal
completion) 객체 또는 throw 완료(throw
completion) 를 반환한다. 호출 시 다음 단계를 수행한다:
obj 에 ! RegExpAlloc (%RegExp% )를 할당한다.
? RegExpInitialize (obj ,
P , F )를 반환한다.
22.2.3.2 RegExpAlloc ( newTarget )
추상 연산 RegExpAlloc은 newTarget (생성자 )를 인수로 받고, 값 완료(normal
completion) 객체 또는 throw 완료(throw
completion) 를 반환한다. 호출 시 다음 단계를 수행한다:
obj 에 ? OrdinaryCreateFromConstructor (newTarget ,
"%RegExp.prototype%" , « [[OriginalSource]] , [[OriginalFlags]] , [[RegExpRecord]] , [[RegExpMatcher]] »)를 할당한다.
! DefinePropertyOrThrow (obj ,
"lastIndex" , PropertyDescriptor { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
obj 를 반환한다.
22.2.3.3 RegExpInitialize ( obj , pattern ,
flags )
추상 연산 RegExpInitialize는 obj (객체), pattern (ECMAScript 언어 값 ),
flags (ECMAScript 언어 값 )를 인수로 받고,
값 완료(normal
completion) 객체 또는 throw 완료(throw
completion) 를 반환한다. 호출 시 다음 단계를 수행한다:
pattern 이 undefined 이면, P 에 빈 문자열을 할당한다.
그 외, P 에 ? ToString (pattern )을 할당한다.
flags 가 undefined 이면, F 에 빈 문자열을 할당한다.
그 외, F 에 ? ToString (flags )을 할당한다.
F 가 "d" , "g" ,
"i" , "m" , "s" ,
"u" , "v" , "y" 외의 코드 유닛을
포함하거나, F 에 코드 유닛이 중복되어 있으면 SyntaxError 예외를 throw한다.
F 에 "i" 가 있으면, i 에 true 를,
아니면 false 를 할당한다.
F 에 "m" 가 있으면, m 에 true 를,
아니면 false 를 할당한다.
F 에 "s" 가 있으면, s 에 true 를,
아니면 false 를 할당한다.
F 에 "u" 가 있으면, u 에 true 를,
아니면 false 를 할당한다.
F 에 "v" 가 있으면, v 에 true 를,
아니면 false 를 할당한다.
u 가 true 이거나 v 가 true 이면,
patternText 에 StringToCodePoints (P )를
할당한다.
그 외,
patternText 에 P 의 각 16비트 요소를 유니코드 BMP 코드 포인트로 해석한 결과를
할당한다. 요소에는 UTF-16 디코딩을 적용하지 않는다.
parseResult 에 ParsePattern (patternText ,
u , v )를 할당한다.
parseResult 가 List 의
SyntaxError 객체들을 포함하는 비어있지 않은 리스트이면,
SyntaxError 예외를 throw한다.
Assert :
parseResult 는 Pattern Parse Node 이어야 한다.
obj .[[OriginalSource]] 에 P 를 할당한다.
obj .[[OriginalFlags]] 에 F 를 할당한다.
capturingGroupsCount 에 CountLeftCapturingParensWithin (parseResult )를
할당한다.
rer 에 RegExp 레코드 { [[IgnoreCase]] : i , [[Multiline]] : m , [[DotAll]] : s , [[Unicode]] : u , [[UnicodeSets]] : v , [[CapturingGroupsCount]] :
capturingGroupsCount }를 할당한다.
obj .[[RegExpRecord]] 에 rer 를 할당한다.
obj .[[RegExpMatcher]] 에 CompilePattern 를
parseResult 에 rer 를 인수로 호출한 결과를 할당한다.
? Set (obj ,
"lastIndex" , +0 𝔽 ,
true )를 수행한다.
obj 를 반환한다.
22.2.3.4 정적 의미론: ParsePattern (
patternText , u , v )
추상 연산 ParsePattern은 patternText (유니코드 코드 포인트 시퀀스), u (Boolean),
v (Boolean)을 인수로 받고, Parse Node 또는 비어있지 않은 List 의
SyntaxError 객체들을 반환한다.
참고
호출 시 다음 단계를 수행한다:
v 가 true 이고 u 가
true 이면,
parseResult 에 하나 이상의 SyntaxError 객체를 포함하는
List 를
할당한다.
그 외 v 가 true 이면,
parseResult 에 ParseText (patternText ,
Pattern [+UnicodeMode,
+UnicodeSetsMode,
+NamedCaptureGroups] )를 할당한다.
그 외 u 가 true 이면,
parseResult 에 ParseText (patternText ,
Pattern [+UnicodeMode,
~UnicodeSetsMode,
+NamedCaptureGroups] )를 할당한다.
그 외,
parseResult 에 ParseText (patternText ,
Pattern [~UnicodeMode,
~UnicodeSetsMode,
+NamedCaptureGroups] )를 할당한다.
parseResult 를 반환한다.
22.2.4 RegExp 생성자
RegExp 생성자 :
%RegExp% 이다.
전역
객체 의 "RegExp" 프로퍼티의 초기값이다.
생성자 로 호출될
때 새로운 RegExp 객체를 생성하고 초기화한다.
함수로 호출될 때에는 새로운 RegExp 객체를 반환하거나, 인자가 RegExp 객체 하나뿐이라면 그 객체 자신을 반환한다.
클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 RegExp 동작을 상속하려는 서브클래스 생성자 는 필요한 내부
슬롯으로 서브클래스 인스턴스를 생성·초기화하기 위해 RegExp 생성자 에 대한 super 호출을 반드시 포함해야 한다.
22.2.4.1 RegExp ( pattern , flags )
이 함수는 호출 시 다음 단계를 수행한다:
patternIsRegExp 에 ? IsRegExp (pattern )을 할당한다.
NewTarget이 undefined 이면,
newTarget 에 활성 함수
객체 를 할당한다.
patternIsRegExp 가 true 이고 flags 가
undefined 이면,
patternConstructor 에 ? Get (pattern ,
"constructor" )를 할당한다.
SameValue (newTarget ,
patternConstructor )가 true 이면
pattern 을 반환한다.
그 외,
newTarget 에 NewTarget을 할당한다.
pattern 이 객체 이고 pattern 에 [[RegExpMatcher]] 내부 슬롯이 있으면,
P 에 pattern .[[OriginalSource]] 를 할당한다.
flags 가 undefined 이면 F 에
pattern .[[OriginalFlags]] 를 할당한다.
그 외 F 에 flags 를 할당한다.
그 외 patternIsRegExp 가 true 이면,
P 에 ? Get (pattern ,
"source" )를 할당한다.
flags 가 undefined 이면,
F 에 ? Get (pattern ,
"flags" )를 할당한다.
그 외,
F 에 flags 를 할당한다.
그 외,
P 에 pattern 을 할당한다.
F 에 flags 를 할당한다.
O 에 ? RegExpAlloc (newTarget )을 할당한다.
? RegExpInitialize (O ,
P , F )를 반환한다.
참고
pattern이 StringLiteral 로 제공되는 경우, 본 함수에서 문자열을
처리하기 전에 일반적인 escape 시퀀스 치환이 수행된다. 패턴이 본 함수에서 escape 시퀀스를 포함해야만 인식되는 경우, StringLiteral 내부에서
U+005C(REVERSE SOLIDUS) 코드 포인트를 escape 처리해야 StringLiteral 내용이 생성될 때 제거되지 않는다.
22.2.5 RegExp 생성자의 속성들
RegExp 생성자 :
22.2.5.1 RegExp.escape ( S )
이 함수는 S 의 복사본을 반환하는데, 정규표현식 Pattern 에서 잠재적으로 특별한 문자가 각각 등가의 escape 시퀀스로 대체되어
있다.
호출 시 다음 단계를 수행한다:
S 가 문자열이
아니면 TypeError 예외를 throw한다.
escaped 에 빈 문자열을 할당한다.
cpList 에 StringToCodePoints (S )를
할당한다.
cpList 의 각 코드포인트 cp 에 대해, 다음을 수행한다:
escaped 가 빈 문자열이고 cp 가 DecimalDigit 또는 AsciiLetter 에
매치되면,
참고: 선행 숫자를 escape하는 것은 출력이 \0 문자 escape 또는 DecimalEscape (예:
\1) 뒤에 사용될 때 S 와 일치하도록 보장하고, 앞선 escape 시퀀스의
확장으로 해석되는 것을 방지한다. 선행 ASCII 문자를 escape하는 것도 \c 뒤의 상황에
대해 동일하다.
numericValue 에 cp 의 숫자값을 할당한다.
hex 에 Number::toString (𝔽 (numericValue ), 16)을
할당한다.
Assert : hex 의 길이는
2이다.
escaped 에 코드 유닛 0x005C(REVERSE SOLIDUS),
"x" , hex 를 문자열 연결 하여 할당한다.
그 외,
escaped 에 escaped 와 EncodeForRegExpEscape (cp )를
문자열 연결 하여 할당한다.
escaped 를 반환한다.
참고
이름이 비슷하지만 EscapeRegExpPattern 과
RegExp.escape는 서로 다른 동작을 한다. 전자는 패턴을 문자열로 표현하기 위해 escape하고, 이 함수는 문자열을
패턴 내부에 표현하기 위해 escape한다.
22.2.5.1.1 EncodeForRegExpEscape ( cp )
추상 연산 EncodeForRegExpEscape는 cp (코드 포인트)를 인수로 받아 문자열을 반환한다. cp 에 매치하는
Pattern 을 나타내는 문자열을 반환한다.
cp 가 공백 또는 ASCII 구두점이면 반환값은 escape 시퀀스이다. 그렇지 않으면 반환값은 문자열
cp 자체이다. 호출 시 다음 단계를 수행한다:
cp 가 SyntaxCharacter 에 매치되거나
cp 가 U+002F(SOLIDUS)면,
코드 유닛 0x005C(REVERSE SOLIDUS)와 UTF16EncodeCodePoint (cp )를
문자열 연결 하여 반환한다.
그 외 cp 가 표
67 의 "Code Point" 열에 나열된 코드 포인트면,
코드 유닛 0x005C(REVERSE SOLIDUS)와 해당 행의 "ControlEscape" 열의 문자열을 문자열 연결 하여 반환한다.
otherPunctuators 에 문자열 연결 하여
",-=<>#&!%:;@~'`" 와 코드 유닛 0x0022(QUOTATION MARK)를
할당한다.
toEscape 에 StringToCodePoints (otherPunctuators )를
할당한다.
toEscape 에 cp 가 포함되거나, cp 가 WhiteSpace 또는
LineTerminator 에 매치되거나,
cp 가 선행 서러게이트 또는 후행
서러게이트 와 동일한 숫자값을 가지면,
cpNum 에 cp 의 숫자값을 할당한다.
cpNum ≤ 0xFF이면,
hex 에 Number::toString (𝔽 (cpNum ), 16)을
할당한다.
코드 유닛 0x005C(REVERSE SOLIDUS), "x" , StringPad (hex ,
2, "0" , start )를
문자열 연결 하여
반환한다.
escaped 에 빈 문자열을 할당한다.
codeUnits 에 UTF16EncodeCodePoint (cp )를
할당한다.
codeUnits 의 각 코드 유닛 cu 에 대해,
escaped 에 escaped 와 UnicodeEscape (cu )를
문자열 연결 하여
할당한다.
escaped 를 반환한다.
UTF16EncodeCodePoint (cp )를
반환한다.
22.2.5.2 RegExp.prototype
RegExp.prototype의 초기값은 RegExp 프로토타입
객체 이다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }이다.
22.2.5.3 get RegExp [ %Symbol.species% ]
RegExp[%Symbol.species%]는 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
this 값을 반환한다.
이 함수의 "name" 프로퍼티 값은 "get [Symbol.species]" 이다.
참고
RegExp 프로토타입 메서드는 일반적으로 자신의 this 값의 생성자 를 사용하여 파생 객체를 생성한다.
하지만 서브클래스 생성자 는 %Symbol.species% 프로퍼티를 재정의하여
기본 동작을 오버라이드할 수 있다.
22.2.6 RegExp 프로토타입 객체의 속성들
RegExp 프로토타입 객체 :
%RegExp.prototype% 이다.
일반
객체 이다.
RegExp 인스턴스가 아니며 [[RegExpMatcher]] 내부 슬롯이나 RegExp 인스턴스 객체의 기타 내부
슬롯을 갖지 않는다.
[[Prototype]] 내부 슬롯을 가지며, 그 값은 %Object.prototype% 이다.
참고
RegExp 프로토타입 객체는 자체적으로 "valueOf" 프로퍼티를 가지지 않지만, Object 프로토타입
객체 로부터 "valueOf" 프로퍼티를 상속받는다.
22.2.6.1 RegExp.prototype.constructor
RegExp.prototype.constructor의 초기값은 %RegExp% 이다.
22.2.6.2 RegExp.prototype.exec ( string )
이 메서드는 string 에서 정규표현식 패턴이 출현하는지 검색하고, 일치 결과를 담은 배열을 반환하거나 string 이 일치하지
않으면 null 을 반환한다.
호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
? RequireInternalSlot (R ,
[[RegExpMatcher]] )를 수행한다.
S 에 ? ToString (string )을 할당한다.
? RegExpBuiltinExec (R ,
S )를 반환한다.
22.2.6.3 get RegExp.prototype.dotAll
RegExp.prototype.dotAll은 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
cu 에 코드 유닛 0x0073(LATIN SMALL LETTER S)를 할당한다.
? RegExpHasFlag (R ,
cu )를 반환한다.
22.2.6.4 get RegExp.prototype.flags
RegExp.prototype.flags은 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
R 이 객체가 아니면 TypeError
예외를 throw한다.
codeUnits 에 새 빈 List 를 할당한다.
hasIndices 에 ToBoolean (? Get (R ,
"hasIndices" ))를 할당한다.
hasIndices 가 true 이면, 코드 유닛 0x0064(LATIN SMALL LETTER
D)를 codeUnits 에 추가한다.
global 에 ToBoolean (? Get (R ,
"global" ))를 할당한다.
global 이 true 이면, 코드 유닛 0x0067(LATIN SMALL LETTER G)를
codeUnits 에 추가한다.
ignoreCase 에 ToBoolean (? Get (R ,
"ignoreCase" ))를 할당한다.
ignoreCase 가 true 이면, 코드 유닛 0x0069(LATIN SMALL LETTER
I)를 codeUnits 에 추가한다.
multiline 에 ToBoolean (? Get (R ,
"multiline" ))를 할당한다.
multiline 이 true 이면, 코드 유닛 0x006D(LATIN SMALL LETTER M)를
codeUnits 에 추가한다.
dotAll 에 ToBoolean (? Get (R ,
"dotAll" ))를 할당한다.
dotAll 이 true 이면, 코드 유닛 0x0073(LATIN SMALL LETTER S)를
codeUnits 에 추가한다.
unicode 에 ToBoolean (? Get (R ,
"unicode" ))를 할당한다.
unicode 가 true 이면, 코드 유닛 0x0075(LATIN SMALL LETTER U)를
codeUnits 에 추가한다.
unicodeSets 에 ToBoolean (? Get (R ,
"unicodeSets" ))를 할당한다.
unicodeSets 가 true 이면, 코드 유닛 0x0076(LATIN SMALL LETTER
V)를 codeUnits 에 추가한다.
sticky 에 ToBoolean (? Get (R ,
"sticky" ))를 할당한다.
sticky 가 true 이면, 코드 유닛 0x0079(LATIN SMALL LETTER Y)를
codeUnits 에 추가한다.
codeUnits 의 요소로 이루어진 문자열 값을 반환한다. codeUnits 에 요소가 없으면 빈 문자열을
반환한다.
22.2.6.4.1 RegExpHasFlag ( R , codeUnit
)
추상 연산 RegExpHasFlag는 R (ECMAScript 언어
값 ), codeUnit (코드 유닛)을 인수로 받고, 값 완료(normal
completion) 로 Boolean 또는 undefined 를, 또는
throw 완료 를 반환한다.
호출 시 다음 단계를 수행한다:
R 이 객체가 아니면
TypeError 예외를 throw한다.
R 에 [[OriginalFlags]] 내부 슬롯이 없으면,
SameValue (R ,
%RegExp.prototype% )
가 true 이면 undefined 를 반환한다.
그 외에는 TypeError 예외를 throw한다.
flags 에 R .[[OriginalFlags]] 를 할당한다.
flags 에 codeUnit 이 포함되어 있으면 true 를 반환한다.
false 를 반환한다.
22.2.6.5 get RegExp.prototype.global
RegExp.prototype.global은 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
cu 에 코드 유닛 0x0067(LATIN SMALL LETTER G)를 할당한다.
? RegExpHasFlag (R ,
cu )를 반환한다.
22.2.6.6 get RegExp.prototype.hasIndices
RegExp.prototype.hasIndices은 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
cu 에 코드 유닛 0x0064(LATIN SMALL LETTER D)를 할당한다.
? RegExpHasFlag (R ,
cu )를 반환한다.
22.2.6.7 get RegExp.prototype.ignoreCase
RegExp.prototype.ignoreCase은 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
cu 에 코드 유닛 0x0069(LATIN SMALL LETTER I)를 할당한다.
? RegExpHasFlag (R ,
cu )를 반환한다.
22.2.6.8 RegExp.prototype [ %Symbol.match% ] ( string
)
이 메서드는 호출 시 다음 단계를 수행한다:
rx 에 this 값을 할당한다.
rx 이 객체가 아니면 TypeError
예외를 throw한다.
S 에 ? ToString (string )을 할당한다.
flags 에 ? ToString (? Get (rx ,
"flags" ))를 할당한다.
flags 에 "g" 이 포함되어 있지 않으면,
? RegExpExec (rx ,
S )를 반환한다.
그 외,
flags 에 "u" 나 "v" 가 포함되어 있으면
fullUnicode 에 true 를, 아니면
false 를 할당한다.
? Set (rx ,
"lastIndex" , +0 𝔽 ,
true )를 수행한다.
A 에 ! ArrayCreate (0)을 할당한다.
n 에 0을 할당한다.
반복,
result 에 ? RegExpExec (rx ,
S )를 할당한다.
result 가 null 이면,
n = 0이면 null 을 반환한다.
A 를 반환한다.
그 외,
matchStr 에 ? ToString (?
Get (result ,
"0" ))를 할당한다.
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (n )),
matchStr )를 수행한다.
matchStr 이 빈 문자열이면,
thisIndex 에 ℝ (?
ToLength (?
Get (rx ,
"lastIndex" )))를 할당한다.
nextIndex 에 AdvanceStringIndex (S ,
thisIndex , fullUnicode )를 할당한다.
? Set (rx ,
"lastIndex" , 𝔽 (nextIndex ),
true )를 수행한다.
n 에 n + 1을 할당한다.
이 메서드의 "name" 프로퍼티 값은
"[Symbol.match]" 이다.
참고
%Symbol.match% 프로퍼티는 IsRegExp
추상 연산에서 객체가 기본적인 정규표현식 동작을 가지는지를 식별하는 데 사용된다. %Symbol.match% 프로퍼티가 없거나 그 값이
Boolean 변환 시 true 가 아니면 해당 객체는 정규표현식 객체로 사용하기 위한 것이 아니다.
22.2.6.9 RegExp.prototype [ %Symbol.matchAll% ] (
string )
이 메서드는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
R 이 객체가 아니면 TypeError
예외를 throw한다.
S 에 ? ToString (string )을 할당한다.
C 에 ? SpeciesConstructor (R ,
%RegExp% )를 할당한다.
flags 에 ? ToString (? Get (R ,
"flags" ))를 할당한다.
matcher 에 ? Construct (C , « R ,
flags »)를 할당한다.
lastIndex 에 ? ToLength (? Get (R ,
"lastIndex" ))를 할당한다.
? Set (matcher ,
"lastIndex" , lastIndex , true )를
수행한다.
flags 에 "g" 이 포함되어 있으면 global 에
true 를, 아니면 false 를 할당한다.
flags 에 "u" 나 "v" 가 포함되어 있으면
fullUnicode 에 true 를 할당한다.
그 외 fullUnicode 에 false 를 할당한다.
CreateRegExpStringIterator (matcher ,
S , global , fullUnicode )를 반환한다.
이 메서드의 "name" 프로퍼티 값은
"[Symbol.matchAll]" 이다.
22.2.6.10 get RegExp.prototype.multiline
RegExp.prototype.multiline은 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
cu 에 코드 유닛 0x006D(LATIN SMALL LETTER M)를 할당한다.
? RegExpHasFlag (R ,
cu )를 반환한다.
22.2.6.11 RegExp.prototype [ %Symbol.replace% ] (
string , replaceValue )
이 메서드는 호출 시 다음 단계를 수행한다:
rx 에 this 값을 할당한다.
rx 이 객체가 아니면 TypeError
예외를 throw한다.
S 에 ? ToString (string )을 할당한다.
lengthS 에 S 의 길이를 할당한다.
functionalReplace 에 IsCallable (replaceValue )를
할당한다.
functionalReplace 이 false 이면,
replaceValue 에 ? ToString (replaceValue )를
할당한다.
flags 에 ? ToString (? Get (rx ,
"flags" ))를 할당한다.
flags 에 "g" 이 포함되어 있으면 global 에
true 를, 아니면 false 를 할당한다.
global 이 true 이면,
? Set (rx ,
"lastIndex" , +0 𝔽 ,
true )를 수행한다.
results 에 새 빈 List 를 할당한다.
done 에 false 를 할당한다.
반복, done 이 false 인 동안,
result 에 ? RegExpExec (rx ,
S )를 할당한다.
result 가 null 이면,
done 에 true 를 할당한다.
그 외,
result 를 results 에 추가한다.
global 이 false 이면,
done 에 true 를 할당한다.
그 외,
matchStr 에 ? ToString (?
Get (result ,
"0" ))를 할당한다.
matchStr 이 빈 문자열이면,
thisIndex 에 ℝ (?
ToLength (?
Get (rx ,
"lastIndex" )))를 할당한다.
flags 에 "u" 나
"v" 가 포함되어 있으면
fullUnicode 에 true 를,
아니면 false 를 할당한다.
nextIndex 에 AdvanceStringIndex (S ,
thisIndex , fullUnicode )를 할당한다.
? Set (rx ,
"lastIndex" , 𝔽 (nextIndex ),
true )를 수행한다.
accumulatedResult 에 빈 문자열을 할당한다.
nextSourcePosition 에 0을 할당한다.
results 의 각 요소 result 에 대해,
resultLength 에 ? LengthOfArrayLike (result )를
할당한다.
nCaptures 에 max (resultLength - 1, 0)를
할당한다.
matched 에 ? ToString (?
Get (result ,
"0" ))를 할당한다.
matchLength 에 matched 의 길이를 할당한다.
position 에 ? ToIntegerOrInfinity (? Get (result ,
"index" ))를 할당한다.
position 을 0과 lengthS 사이로 클램핑(clamping) 한다.
captures 에 새 빈 List 를
할당한다.
n 에 1을 할당한다.
반복, n ≤ nCaptures 인 동안,
capN 에 ? Get (result ,
! ToString (𝔽 (n ))).
capN 이 undefined 가 아니면,
capN 에 ? ToString (capN )을
할당한다.
capN 을 captures 에 추가한다.
참고: n = 1일 때 위 단계는 captures (인덱스 0)에 첫 번째 요소를
넣는다. 보다 일반적으로 n 번째 캡처(캡처 괄호 집합에 의해 캡처된 문자들)는
captures [n - 1]에 있다.
n 에 n + 1을 할당한다.
namedCaptures 에 ? Get (result ,
"groups" )를 할당한다.
functionalReplace 가 true 이면,
replacerArgs 에 « matched »,
captures , « 𝔽 (position ),
S »의 리스트
연결(list-concatenation) 을 할당한다.
namedCaptures 가 undefined 가 아니면,
namedCaptures 를 replacerArgs 에 추가한다.
replacementValue 에 ? Call (replaceValue ,
undefined , replacerArgs )를 할당한다.
replacementString 에 ? ToString (replacementValue )를
할당한다.
그 외,
namedCaptures 가 undefined 가 아니면,
namedCaptures 에 ? ToObject (namedCaptures )를
할당한다.
replacementString 에 ? GetSubstitution (matched ,
S , position , captures ,
namedCaptures , replaceValue )를 할당한다.
position ≥ nextSourcePosition 이면,
참고: position 이 일반적으로 뒤로 이동하면 안 된다. 만약 그렇다면 이는 잘못된 동작의
RegExp 서브클래스이거나 global 플래그 또는 rx 의 기타 특성을 변경하는 접근 트리거 부작용의
사용을 나타낸다. 이런 경우 해당 치환은 무시된다.
accumulatedResult 에 accumulatedResult ,
S 의 nextSourcePosition 부터 position 까지의
부분
문자열(substring) , replacementString 을
문자열 연결 하여 할당한다.
nextSourcePosition 에 position +
matchLength 를 할당한다.
nextSourcePosition ≥ lengthS 이면 accumulatedResult 를
반환한다.
accumulatedResult 와 S 의 nextSourcePosition 부터 마지막까지의
부분
문자열(substring) 을 문자열 연결 하여 반환한다.
이 메서드의 "name" 프로퍼티 값은
"[Symbol.replace]" 이다.
22.2.6.12 RegExp.prototype [ %Symbol.search% ] (
string )
이 메서드는 호출 시 다음 단계를 수행한다:
rx 에 this 값을 할당한다.
rx 이 객체가 아니면 TypeError
예외를 throw한다.
S 에 ? ToString (string )을 할당한다.
previousLastIndex 에 ? Get (rx ,
"lastIndex" )를 할당한다.
previousLastIndex 가 +0 𝔽 이 아니면,
? Set (rx ,
"lastIndex" , +0 𝔽 ,
true )를 수행한다.
result 에 ? RegExpExec (rx , S )를
할당한다.
currentLastIndex 에 ? Get (rx ,
"lastIndex" )를 할당한다.
SameValue (currentLastIndex ,
previousLastIndex )가 false 이면,
? Set (rx ,
"lastIndex" , previousLastIndex ,
true )를 수행한다.
result 가 null 이면 -1 𝔽 를
반환한다.
? Get (result ,
"index" )를 반환한다.
이 메서드의 "name" 프로퍼티 값은
"[Symbol.search]" 이다.
참고
검색을 수행할 때 이 RegExp 객체의 "lastIndex" 와 "global"
프로퍼티는 무시된다. "lastIndex" 프로퍼티는 변경되지 않는다.
22.2.6.13 get RegExp.prototype.source
RegExp.prototype.source은 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
R 이 객체가 아니면 TypeError
예외를 throw한다.
R 에 [[OriginalSource]] 내부 슬롯이 없으면,
SameValue (R ,
%RegExp.prototype% )
가 true 이면 "(?:)" 를 반환한다.
그 외에는 TypeError 예외를 throw한다.
Assert :
R 에 [[OriginalFlags]] 내부 슬롯이 있다.
src 에 R .[[OriginalSource]] 를 할당한다.
flags 에 R .[[OriginalFlags]] 를 할당한다.
EscapeRegExpPattern (src ,
flags )를 반환한다.
22.2.6.13.1 EscapeRegExpPattern ( P , F
)
추상 연산 EscapeRegExpPattern은 P (문자열), F (문자열)를 인수로 받아 문자열을 반환한다. 호출 시
다음 단계를 수행한다:
F 에 "v" 가 포함되어 있으면,
patternSymbol 에 Pattern [+UnicodeMode,
+UnicodeSetsMode] 을 할당한다.
그 외 F 에 "u" 가 포함되어 있으면,
patternSymbol 에 Pattern [+UnicodeMode,
~UnicodeSetsMode] 을 할당한다.
그 외,
patternSymbol 에 Pattern [~UnicodeMode,
~UnicodeSetsMode] 을 할당한다.
S 에 P 를 UTF-16 인코딩된 유니코드 코드포인트(6.1.4 )로
해석하여 patternSymbol 형태의 문자열을 할당한다. 다음에 설명된 대로 일부 코드포인트는 escape된다.
S 는 P 와 다를 수도 있고 같을 수도 있다. 단, S 를
patternSymbol 로 평가하여 얻는 추상 클로저(Abstract
Closure) 는 생성된 객체의 [[RegExpMatcher]] 내부 슬롯에 의해 정의되는 추상 클로저 와 동일하게 동작해야 한다. 동일한
P , F 로 여러 번 호출해도 결과는 항상 동일해야 한다.
패턴에 등장하는 / 또는 LineTerminator 코드포인트는
S 에서 escape되어야 한다. 이는 문자열
연결(string-concatenation) 을 통해 "/" ,
S , "/" , F 를 적절한 렉시컬 컨텍스트에서 RegularExpressionLiteral 로
파싱할 수 있게 하고, 생성된 정규표현식과 동일하게 동작해야 한다. 예를 들어, P 가
"/" 이면 S 는 "\/" 또는
"\u002F" 등이 될 수 있지만 "/" 는 안 된다. 왜냐하면
/// 뒤에 F 가 오면 SingleLineComment 로 파싱되기
때문이다. P 가 빈 문자열이면 S 를 "(?:)" 로 하면 된다.
S 를 반환한다.
참고
이름이 비슷하지만 RegExp.escape와 EscapeRegExpPattern은 동작이 다르다. 전자는 문자열을 패턴
내부에 표현하기 위해 escape하고, 이 함수는 패턴을 문자열로 표현하기 위해 escape한다.
22.2.6.14 RegExp.prototype [ %Symbol.split% ] (
string , limit )
참고 1
이 메서드는 string 을 문자열로 변환한 결과의 부분 문자열들을 배열로 반환한다. 부분 문자열들은 왼쪽에서 오른쪽으로
this 값의 정규표현식에 매치되는 구간을 기준으로 나뉘는데, 매치된 구간들은 반환 배열의 어떤 문자열에도 포함되지
않고, 문자열을 분리하는 역할만 한다.
this 값이 빈 정규표현식이거나 빈 문자열에 매치될 수 있는 정규표현식일 수도 있다. 이 경우 정규표현식은 입력
문자열의 처음이나 끝에 있는 빈 부분 문자열 , 또는 이전 구분자 매치의 끝에 있는 빈
부분 문자열 과는 매치되지 않는다. (예: 정규표현식이 빈 문자열에 매치된다면 문자열은 개별 코드 유닛
단위로 분리된다. 결과 배열의 길이는 문자열의 길이와 같고 각 부분 문자열 에는 코드 유닛 하나만
포함된다.) 주어진 인덱스에서의 첫 번째 매치만 고려하며, 백트래킹으로 해당 인덱스에서 비어있지 않은 부분
문자열 매치를 얻을 수 있어도 무시한다. (예: /a*?/[Symbol.split]("ab")는
배열 ["a", "b"]가 되고, /a*/[Symbol.split]("ab")는
["","b"]가 된다.)
string 이(혹은 변환 결과가) 빈 문자열이면, 결과는 정규표현식이 빈 문자열에 매치되는지 여부에 따라 달라진다. 매치된다면 결과
배열에는 아무 요소도 없다. 그렇지 않으면 결과 배열에 빈 문자열 하나가 들어간다.
정규표현식에 캡처 괄호가 있으면 separator 가 매치될 때마다 캡처된 결과(캡처 실패 시
undefined 포함)들이 출력 배열에 삽입된다. 예시:
/<(\/)?([^<> ]+)>/[Symbol.split]("A<B > bold</B > and<CODE > coded</CODE > ")
이 표현식의 결과 배열:
["A" , undefined , "B" , "bold" , "/" , "B" , "and" , undefined , "CODE" , "coded" , "/" , "CODE" , "" ]
limit 이 undefined 가 아니면, 출력 배열은 limit 개까지만
포함한다.
이 메서드는 호출 시 다음 단계를 수행한다:
rx 에 this 값을 할당한다.
rx 이 객체가 아니면 TypeError
예외를 throw한다.
S 에 ? ToString (string )을 할당한다.
C 에 ? SpeciesConstructor (rx ,
%RegExp% )를 할당한다.
flags 에 ? ToString (? Get (rx ,
"flags" ))를 할당한다.
flags 에 "u" 또는 "v" 가 포함되어 있으면
unicodeMatching 에 true 를 할당한다.
그 외 unicodeMatching 에 false 를 할당한다.
flags 에 "y" 가 포함되어 있으면 newFlags 에
flags 를 할당한다.
그 외 newFlags 에 flags 와 "y" 를 문자열
연결(string-concatenation) 하여 할당한다.
splitter 에 ? Construct (C ,
« rx ,
newFlags »)를 할당한다.
A 에 ! ArrayCreate (0)을 할당한다.
lengthA 에 0을 할당한다.
limit 이 undefined 이면 lim 에 232 -
1를, 아니면 lim 에 ℝ (? ToUint32 (limit ))를 할당한다.
lim = 0이면 A 를 반환한다.
S 가 빈 문자열이면,
z 에 ? RegExpExec (splitter ,
S )를 할당한다.
z 가 null 이 아니면 A 를 반환한다.
! CreateDataPropertyOrThrow (A ,
"0" , S )를 수행한다.
A 를 반환한다.
size 에 S 의 길이를 할당한다.
p 에 0을 할당한다.
q 에 p 를 할당한다.
반복, q < size 인 동안,
? Set (splitter ,
"lastIndex" , 𝔽 (q ),
true )를 수행한다.
z 에 ? RegExpExec (splitter ,
S )를 할당한다.
z 가 null 이면,
q 에 AdvanceStringIndex (S ,
q , unicodeMatching )를 할당한다.
그 외,
e 에 ℝ (? ToLength (? Get (splitter ,
"lastIndex" )))를 할당한다.
e 에 min (e ,
size )를 할당한다.
e = p 이면,
q 에 AdvanceStringIndex (S ,
q , unicodeMatching )를 할당한다.
그 외,
T 에 S 의 p 부터 q 까지의
부분 문자열(substring) 을
할당한다.
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (lengthA )),
T )를 수행한다.
lengthA 에 lengthA + 1을 할당한다.
lengthA = lim 이면 A 를 반환한다.
p 에 e 를 할당한다.
numberOfCaptures 에 ? LengthOfArrayLike (z )를
할당한다.
numberOfCaptures 에 max (numberOfCaptures
- 1, 0)를 할당한다.
i 에 1을 할당한다.
반복, i ≤ numberOfCaptures 인 동안,
nextCapture 에 ? Get (z ,
! ToString (𝔽 (i ))).
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (lengthA )),
nextCapture )를 수행한다.
i 에 i + 1을 할당한다.
lengthA 에 lengthA + 1을 할당한다.
lengthA = lim 이면
A 를 반환한다.
q 에 p 를 할당한다.
T 에 S 의 p 부터 size 까지의 부분
문자열(substring) 을 할당한다.
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (lengthA )),
T )를 수행한다.
A 를 반환한다.
이 메서드의 "name" 프로퍼티 값은
"[Symbol.split]" 이다.
참고 2
이 메서드는 이 RegExp 객체의 "global" 과 "sticky" 프로퍼티 값을
무시한다.
22.2.6.15 get RegExp.prototype.sticky
RegExp.prototype.sticky는 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
cu 에 코드 유닛 0x0079(LATIN SMALL LETTER Y)를 할당한다.
? RegExpHasFlag (R ,
cu )를 반환한다.
22.2.6.16 RegExp.prototype.test ( S )
이 메서드는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
R 이 객체가 아니면 TypeError
예외를 throw한다.
string 에 ? ToString (S )를 할당한다.
match 에 ? RegExpExec (R ,
string )를 할당한다.
match 가 null 이 아니면 true 를, 아니면
false 를 반환한다.
22.2.6.17 RegExp.prototype.toString ( )
R 에 this 값을 할당한다.
R 이 객체가 아니면 TypeError
예외를 throw한다.
pattern 에 ? ToString (? Get (R ,
"source" ))를 할당한다.
flags 에 ? ToString (? Get (R ,
"flags" ))를 할당한다.
result 에 문자열 연결(string-concatenation) 을
사용해 "/" , pattern , "/" ,
flags 를 이어붙여 할당한다.
result 를 반환한다.
참고
반환되는 문자열은 RegularExpressionLiteral
형태를 가지며, 이 객체와 동일하게 동작하는 다른 RegExp 객체로 평가된다.
22.2.6.18 get RegExp.prototype.unicode
RegExp.prototype.unicode는 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
cu 에 코드 유닛 0x0075(LATIN SMALL LETTER U)를 할당한다.
? RegExpHasFlag (R ,
cu )를 반환한다.
22.2.6.19 get RegExp.prototype.unicodeSets
RegExp.prototype.unicodeSets는 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
cu 에 코드 유닛 0x0076(LATIN SMALL LETTER V)를 할당한다.
? RegExpHasFlag (R ,
cu )를 반환한다.
22.2.7 정규표현식 매칭에 대한 추상 연산
22.2.7.1 RegExpExec ( R , S )
추상 연산 RegExpExec는 R (객체), S (문자열)를 인수로 받고, 값 완료(normal
completion) 로 객체나 null 또는 throw 완료 를 반환한다. 호출 시
다음 단계를 수행한다:
exec 에 ? Get (R ,
"exec" )를 할당한다.
IsCallable (exec )가
true 이면,
result 에 ? Call (exec ,
R , « S »)를 할당한다.
result 가 객체가 아니고 result 가
null 이 아니면 TypeError 예외를 throw한다.
result 를 반환한다.
? RequireInternalSlot (R ,
[[RegExpMatcher]] )를 수행한다.
? RegExpBuiltinExec (R ,
S )를 반환한다.
참고
호출 가능한 "exec" 프로퍼티가 없으면 이 알고리즘은 내장 정규표현식 매칭 알고리즘을 사용한다. 이는 이전 버전에서
정규표현식을 사용하는 대부분의 내장 알고리즘이 "exec" 의 동적 프로퍼티 조회를 수행하지 않았던 코드와 호환되는
동작을 제공한다.
22.2.7.2 RegExpBuiltinExec ( R , S )
추상 연산 RegExpBuiltinExec는 R (초기화된 RegExp 인스턴스), S (문자열)를 인수로 받고, 값 완료(normal
completion) 로 배열 특수 객체(Array exotic object) 또는
null 또는 throw
완료 를 반환한다. 호출 시 다음 단계를 수행한다:
length 에 S 의 길이를 할당한다.
lastIndex 에 ℝ (? ToLength (? Get (R ,
"lastIndex" )))를 할당한다.
flags 에 R .[[OriginalFlags]] 를 할당한다.
flags 에 "g" 가 포함되어 있으면 global 에
true 를, 아니면 false 를 할당한다.
flags 에 "y" 가 포함되어 있으면 sticky 에
true 를, 아니면 false 를 할당한다.
flags 에 "d" 가 포함되어 있으면 hasIndices 에
true 를, 아니면 false 를 할당한다.
global 이 false 이고 sticky 가
false 이면 lastIndex 를 0으로 설정한다.
matcher 에 R .[[RegExpMatcher]] 를 할당한다.
flags 에 "u" 나 "v" 가 포함되어 있으면
fullUnicode 에 true 를, 아니면 false 를
할당한다.
matchSucceeded 에 false 를 할당한다.
fullUnicode 가 true 이면 input 에 StringToCodePoints (S )를,
아니면 input 에 S 의 코드 유닛으로 이루어진 List 를 할당한다.
참고: input 의 각 요소는 문자로 취급된다.
반복, matchSucceeded 가 false 인 동안,
lastIndex > length 이면,
global 이 true 이거나 sticky 가
true 이면,
? Set (R ,
"lastIndex" ,
+0 𝔽 ,
true )를 수행한다.
null 을 반환한다.
inputIndex 에 S 의 lastIndex 번째 요소로 얻은 문자의
input 에서의 인덱스를 할당한다.
r 에 matcher (input , inputIndex )를
할당한다.
r 가 failure 이면,
sticky 가 true 이면,
? Set (R ,
"lastIndex" ,
+0 𝔽 ,
true )를 수행한다.
null 을 반환한다.
lastIndex 를 AdvanceStringIndex (S ,
lastIndex , fullUnicode )로 설정한다.
그 외,
Assert : r 는
MatchState 이다.
matchSucceeded 를 true 로 설정한다.
e 에 r .[[EndIndex]] 를 할당한다.
fullUnicode 가 true 이면 e 를 GetStringIndex (S ,
e )로 설정한다.
global 이 true 이거나 sticky 가
true 이면,
? Set (R ,
"lastIndex" , 𝔽 (e ),
true )를 수행한다.
n 에 r .[[Captures]] 의 요소 개수를 할당한다.
Assert :
n = R .[[RegExpRecord]] .[[CapturingGroupsCount]] 이다.
Assert :
n < 232 - 1이다.
A 에 ! ArrayCreate (n + 1)을 할당한다.
Assert :
A 의 "length" 프로퍼티의 수학적 값 은 n + 1이다.
! CreateDataPropertyOrThrow (A ,
"index" , 𝔽 (lastIndex ))를 수행한다.
! CreateDataPropertyOrThrow (A ,
"input" , S )를 수행한다.
match 에 Match Record { [[StartIndex]] : lastIndex , [[EndIndex]] : e }를 할당한다.
indices 에 새 빈 List 를 할당한다.
groupNames 에 새 빈 List 를 할당한다.
match 를 indices 에 추가한다.
matchedSubstr 에 GetMatchString (S ,
match )를 할당한다.
! CreateDataPropertyOrThrow (A ,
"0" , matchedSubstr )를 수행한다.
R 에 GroupName 이 있으면,
groups 에 OrdinaryObjectCreate (null )를
할당한다.
hasGroups 에 true 를 할당한다.
그 외,
groups 에 undefined 를 할당한다.
hasGroups 에 false 를 할당한다.
! CreateDataPropertyOrThrow (A ,
"groups" , groups )를 수행한다.
matchedGroupNames 에 새 빈 List 를 할당한다.
각 integer i 에 대해 1 ≤ i ≤
n 인 경우 오름차순으로 반복,
captureI 에 r .[[Captures]] 의
i 번째 요소를 할당한다.
captureI 가 undefined 이면,
capturedValue 에 undefined 를 할당한다.
undefined 를 indices 에 추가한다.
그 외,
captureStart 에 captureI .[[StartIndex]] 를 할당한다.
captureEnd 에 captureI .[[EndIndex]] 를 할당한다.
fullUnicode 가 true 이면,
captureStart 를 GetStringIndex (S ,
captureStart )로 설정한다.
captureEnd 를 GetStringIndex (S ,
captureEnd )로 설정한다.
capture 에 Match
Record { [[StartIndex]] : captureStart ,
[[EndIndex]] : captureEnd }를
할당한다.
capturedValue 에 GetMatchString (S ,
capture )를 할당한다.
capture 를 indices 에 추가한다.
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (i )),
capturedValue )를 수행한다.
R 의 i 번째 캡처가 GroupName 으로 정의되어 있으면,
s 에 해당 GroupName 의 CapturingGroupName 을
할당한다.
matchedGroupNames 가 s 를 포함하면,
Assert :
capturedValue 는 undefined 이다.
undefined 를 groupNames 에 추가한다.
그 외,
capturedValue 가 undefined 가 아니면
s 를 matchedGroupNames 에 추가한다.
참고: 동일한 이름 s 를 가진 그룹이 둘 이상 있을 수 있다. 이 경우
groups 에 이미 s 프로퍼티가 있을 수 있다. 그러나
groups 는 일반
객체 이고, 프로퍼티는 모두 데이터 프로퍼티(data
properties) 이므로 CreateDataPropertyOrThrow
호출은 반드시 성공한다.
! CreateDataPropertyOrThrow (groups ,
s , capturedValue )를 수행한다.
s 를 groupNames 에 추가한다.
그 외,
undefined 를 groupNames 에 추가한다.
hasIndices 가 true 이면,
indicesArray 에 MakeMatchIndicesIndexPairArray (S ,
indices , groupNames , hasGroups )를 할당한다.
! CreateDataPropertyOrThrow (A ,
"indices" , indicesArray )를 수행한다.
A 를 반환한다.
22.2.7.3 AdvanceStringIndex ( S , index ,
unicode )
추상 연산 AdvanceStringIndex는 S (문자열), index (음수가 아닌 정수(integer) ),
unicode (Boolean)을 인수로 받고 정수(integer) 를 반환한다. 호출 시 다음 단계를 수행한다:
Assert :
index ≤ 253 - 1.
unicode 가 false 이면 index + 1을 반환한다.
length 에 S 의 길이를 할당한다.
index + 1 ≥ length 이면 index + 1을 반환한다.
cp 에 CodePointAt (S ,
index )를 할당한다.
index + cp .[[CodeUnitCount]] 를 반환한다.
22.2.7.4 GetStringIndex ( S ,
codePointIndex )
추상 연산 GetStringIndex는 S (문자열), codePointIndex (음수가 아닌 정수(integer) )를 인수로 받고
음수가 아닌 정수(integer) 를 반환한다. S 를 6.1.4 에 따라 UTF-16
인코딩된 코드포인트 시퀀스로 해석하고, codePointIndex 에 해당하는 코드유닛 인덱스를 반환한다. 그런 인덱스가 없으면
S 의 길이를 반환한다. 호출 시 다음 단계를 수행한다:
S 가 빈 문자열이면 0을 반환한다.
len 에 S 의 길이를 할당한다.
codeUnitCount 에 0을 할당한다.
codePointCount 에 0을 할당한다.
반복, codeUnitCount < len 인 동안,
codePointCount = codePointIndex 이면
codeUnitCount 를 반환한다.
cp 에 CodePointAt (S ,
codeUnitCount )를 할당한다.
codeUnitCount 를 codeUnitCount + cp .[[CodeUnitCount]] 로 설정한다.
codePointCount 를 codePointCount + 1로 설정한다.
len 을 반환한다.
22.2.7.5 매치 레코드(Match Records)
매치 레코드(Match Record) 는 정규표현식 매치나 캡처의 시작 및 끝
인덱스를 캡슐화하는 레코드(Record) 값이다.
매치 레코드는 표
72 에 나열된 필드를 가진다.
표 72: 매치 레코드(Match Record) 필드
필드 이름(Field Name)
값(Value)
의미(Meaning)
[[StartIndex]]
음수가 아닌 정수(integer)
문자열의 시작부터 매치가 시작되는 위치(포함)의 코드유닛 수.
[[EndIndex]]
정수(integer) ≥ [[StartIndex]]
문자열의 시작부터 매치가 끝나는 위치(제외)의 코드유닛 수.
22.2.7.6 GetMatchString ( S , match )
추상 연산 GetMatchString은 S (문자열), match (매치 레코드(Match Record) )를 인수로
받아 문자열을 반환한다. 호출 시 다음 단계를 수행한다:
Assert :
match .[[StartIndex]] ≤ match .[[EndIndex]] ≤ S 의 길이.
S 의 match .[[StartIndex]] 부터
match .[[EndIndex]] 까지의 부분
문자열(substring) 을 반환한다.
22.2.7.7 GetMatchIndexPair ( S , match )
추상 연산 GetMatchIndexPair는 S (문자열), match (매치 레코드(Match
Record) )를 인수로 받아 배열을 반환한다. 호출 시 다음 단계를 수행한다:
Assert :
match .[[StartIndex]] ≤ match .[[EndIndex]] ≤ S 의 길이.
CreateArrayFromList («
𝔽 (match .[[StartIndex]] ), 𝔽 (match .[[EndIndex]] ) »)를 반환한다.
22.2.7.8 MakeMatchIndicesIndexPairArray ( S ,
indices , groupNames , hasGroups )
추상 연산 MakeMatchIndicesIndexPairArray는 S (문자열), indices (Match Records 또는
undefined 의 List ),
groupNames (문자열 또는 undefined 의 List ),
hasGroups (Boolean)를 인수로 받아 배열을 반환한다. 호출 시 다음 단계를 수행한다:
n 에 indices 의 요소 개수를 할당한다.
Assert :
n < 232 - 1.
Assert :
groupNames 는 n - 1개의 요소를 가진다.
참고: groupNames List 의 요소는
indices List 의
indices [1]부터 정렬된다.
A 에 ! ArrayCreate (n )를 할당한다.
hasGroups 가 true 이면,
groups 에 OrdinaryObjectCreate (null )를
할당한다.
그 외,
groups 에 undefined 를 할당한다.
! CreateDataPropertyOrThrow (A ,
"groups" , groups )를 수행한다.
각 integer i 에 대해 0 ≤ i
< n 인 경우 오름차순으로 반복,
matchIndices 에 indices [i ]를 할당한다.
matchIndices 가 undefined 가 아니면,
matchIndexPair 에 GetMatchIndexPair (S ,
matchIndices )를 할당한다.
그 외,
matchIndexPair 에 undefined 를 할당한다.
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (i )),
matchIndexPair )를 수행한다.
i > 0이면,
s 에 groupNames [i - 1]을 할당한다.
s 가 undefined 가 아니면,
Assert :
groups 는 undefined 가 아니다.
참고: 동일한 이름 s 를 가진 그룹이 둘 이상 있을 수 있다. 이 경우
groups 에 이미 s 프로퍼티가 있을 수 있다. 그러나
groups 는 일반
객체 이고, 프로퍼티는 모두 데이터 프로퍼티(data
properties) 이므로 CreateDataPropertyOrThrow
호출은 반드시 성공한다.
! CreateDataPropertyOrThrow (groups ,
s , matchIndexPair )를 수행한다.
A 를 반환한다.
22.2.8 RegExp 인스턴스의 속성
RegExp 인스턴스는 일반
객체 이며,
RegExp 프로토타입
객체 로부터 속성을 상속받는다. RegExp 인스턴스는 내부 슬롯 [[OriginalSource]] , [[OriginalFlags]] , [[RegExpRecord]] , [[RegExpMatcher]] 를 가진다.
[[RegExpMatcher]] 내부 슬롯의 값은 RegExp 객체의 Pattern 에 대한 추상 클로저(Abstract Closure)
표현이다.
참고
ECMAScript 2015 이전에는 RegExp 인스턴스가 자체 데이터 프로퍼티(data properties)
"source" ,
"global" , "ignoreCase" ,
"multiline" 를 가진 것으로 명세되어 있었다. 이 속성들은 이제
RegExp.prototype의 접근자 프로퍼티(accessor properties) 로 명세된다.
RegExp 인스턴스는 다음 속성도 갖는다:
22.2.8.1 lastIndex
"lastIndex" 프로퍼티의 값은 다음 매치를 시작할 문자열 인덱스를 지정한다. 사용될 때 정수(Number) 로 강제 변환된다(자세한 내용은 22.2.7.2 참조). 이 프로퍼티의 속성은 { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }이다.
22.2.9 RegExp 문자열 반복자 객체
RegExp 문자열 반복자(RegExp String Iterator) 는 특정 문자열 인스턴스 객체에서, 특정 RegExp 인스턴스
객체와 매칭하며 반복을 수행하는 객체이다. RegExp 문자열 반복자 객체에 대한 명명된 생성자 는 없다. 대신, RegExp 문자열 반복자 객체는 RegExp
인스턴스의 특정 메서드를 호출해서 생성된다.
22.2.9.1 CreateRegExpStringIterator ( R ,
S , global , fullUnicode )
추상 연산 CreateRegExpStringIterator는 R (객체), S (문자열),
global (Boolean), fullUnicode (Boolean)을 인수로 받아 객체를 반환한다. 호출 시 다음 단계를
수행한다:
iterator 에 OrdinaryObjectCreate (%RegExpStringIteratorPrototype% ,
« [[IteratingRegExp]] , [[IteratedString]] , [[Global]] ,
[[Unicode]] , [[Done]] »).
iterator .[[IteratingRegExp]] 에
R 를 할당한다.
iterator .[[IteratedString]] 에 S 를 할당한다.
iterator .[[Global]] 에 global 을 할당한다.
iterator .[[Unicode]] 에
fullUnicode 를 할당한다.
iterator .[[Done]] 에
false 를 할당한다.
iterator 를 반환한다.
22.2.9.2 %RegExpStringIteratorPrototype% 객체
%RegExpStringIteratorPrototype% 객체:
22.2.9.2.1 %RegExpStringIteratorPrototype%.next ( )
O 에 this 값을 할당한다.
O 이 객체가 아니면
TypeError 예외를 throw한다.
O 에 RegExp 문자열
반복자 객체 인스턴스의 모든 내부 슬롯이 없으면(22.2.9.3
참조),
TypeError 예외를 throw한다.
O .[[Done]] 이 true 이면,
CreateIteratorResultObject (undefined ,
true )를 반환한다.
R 에 O .[[IteratingRegExp]] 를 할당한다.
S 에 O .[[IteratedString]] 를 할당한다.
global 에 O .[[Global]] 를 할당한다.
fullUnicode 에 O .[[Unicode]] 를 할당한다.
match 에 ? RegExpExec (R ,
S )를 할당한다.
match 가 null 이면,
O .[[Done]] 을
true 로 설정한다.
CreateIteratorResultObject (undefined ,
true )를 반환한다.
global 이 false 이면,
O .[[Done]] 을
true 로 설정한다.
CreateIteratorResultObject (match ,
false )를 반환한다.
matchStr 에 ? ToString (?
Get (match ,
"0" ))를 할당한다.
matchStr 이 빈 문자열이면,
thisIndex 에 ℝ (? ToLength (? Get (R ,
"lastIndex" )))를 할당한다.
nextIndex 에 AdvanceStringIndex (S ,
thisIndex , fullUnicode )를 할당한다.
? Set (R ,
"lastIndex" , 𝔽 (nextIndex ),
true )를 수행한다.
CreateIteratorResultObject (match ,
false )를 반환한다.
22.2.9.2.2 %RegExpStringIteratorPrototype% [
%Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기값은
문자열 값 "RegExp String Iterator" 이다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] :
false , [[Configurable]] :
true }이다.
22.2.9.3 RegExp 문자열 반복자 인스턴스의 속성
RegExp 문자열 반복자
인스턴스는 일반
객체 이며,
%RegExpStringIteratorPrototype%
내재 객체로부터 속성을 상속받는다. RegExp 문자열 반복자
인스턴스는 표 73 에 나열된 내부 슬롯으로
초기화된다.
표 73: RegExp 문자열
반복자 인스턴스의 내부 슬롯
내부 슬롯(Internal Slot)
타입(Type)
설명(Description)
[[IteratingRegExp]]
객체(Object)
반복에 사용되는 정규표현식.
IsRegExp ([[IteratingRegExp]] )는 처음에
true 이다.
[[IteratedString]]
문자열(String)
반복 대상이 되는 문자열 값.
[[Global]]
Boolean
[[IteratingRegExp]] 가 글로벌인지 여부.
[[Unicode]]
Boolean
[[IteratingRegExp]] 가 유니코드 모드인지 여부.
[[Done]]
Boolean
반복이 완료되었는지 여부.
23 인덱스된 컬렉션
23.1 배열 객체
배열은 특수
객체 로, 특정 클래스의 프로퍼티 이름에 대해 특별한 처리를 합니다. 이 특별한 처리의 정의는
10.4.2 에서 확인할 수 있습니다.
23.1.1 Array 생성자
Array 생성자 는
다음과 같습니다:
%Array% 입니다.
"Array" 프로퍼티의 초기값이며, 글로벌
객체 의 프로퍼티입니다.
생성자 로 호출될
때 새로운 배열을 생성하고 초기화합니다.
생성자 가 아닌
함수로 호출될 때에도 새로운 배열을 생성하고 초기화합니다. 따라서
Array(…) 함수 호출은 같은 인수를 사용한 new Array(…) 객체 생성 표현식과 동일합니다.
인수의 개수와 타입에 따라 동작이 달라지는 함수입니다.
클래스 정의의 extends 절의 값으로 사용할 수 있습니다. 특수 배열 동작을 상속하려는
생성자 의 하위
클래스는 Array
생성자 를
super로 호출하여 배열 특수 객체 인 하위 클래스 인스턴스를
초기화해야 합니다. 하지만 대부분의 Array.prototype 메서드는 일반 메서드이므로
this 값이 배열 특수
객체 인지에 의존하지 않습니다.
23.1.1.1 Array ( ...values )
이 함수가 호출될 때 다음 단계들을 수행합니다:
NewTarget이 undefined 이면, newTarget 을 현재 활성 함수 객체 로 설정하고, 그렇지 않으면
newTarget 을 NewTarget으로 설정합니다.
proto 를 ? GetPrototypeFromConstructor (newTarget ,
"%Array.prototype%" )로 설정합니다.
numberOfArgs 를 values 의 요소 개수로 설정합니다.
numberOfArgs = 0이면,
! ArrayCreate (0,
proto )를 반환합니다.
그렇지 않고 numberOfArgs = 1이면,
len 을 values [0]으로 설정합니다.
array 를 ! ArrayCreate (0,
proto )로 설정합니다.
len 이 Number 타입이
아니라면 ,
! CreateDataPropertyOrThrow (array ,
"0" , len )을 수행합니다.
intLen 을 1 𝔽 로 설정합니다.
그렇지 않으면,
intLen 을 ! ToUint32 (len )로
설정합니다.
SameValueZero (intLen ,
len )이 false 이면,
RangeError 예외를 발생시킵니다.
! Set (array ,
"length" , intLen , true )을
수행합니다.
array 를 반환합니다.
그 밖의 경우,
Assert : numberOfArgs ≥ 2임을
확인합니다.
array 를 ? ArrayCreate (numberOfArgs ,
proto )로 설정합니다.
k 를 0으로 설정합니다.
k < numberOfArgs 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
itemK 를 values [k ]로 설정합니다.
! CreateDataPropertyOrThrow (array ,
Pk , itemK )를 수행합니다.
k 를 k + 1로 설정합니다.
Assert : 수학적 값
array 의 "length" 프로퍼티는
numberOfArgs 와 같습니다.
array 를 반환합니다.
23.1.2 Array 생성자의 프로퍼티
Array 생성자 는
다음과 같습니다:
[[Prototype]] 내부 슬롯을 가지며, 그 값은 %Function.prototype% 입니다.
"length" 프로퍼티를 가지며, 그 값은 1 𝔽 입니다.
다음과 같은 프로퍼티들을 포함합니다:
23.1.2.1 Array.from ( items [ , mapper [ ,
thisArg ] ] )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
C 를 this 값으로 설정합니다.
mapper 가 undefined 라면,
mapping 을 false 로 설정합니다.
그렇지 않으면,
IsCallable (mapper )
가 false 라면, TypeError 예외를 throw합니다.
mapping 을 true 로 설정합니다.
usingIterator 를 ? GetMethod (items , %Symbol.iterator% )로 설정합니다.
usingIterator 가 undefined 가 아니면,
IsConstructor (C )
가 true 라면,
A 를 ? Construct (C )로
설정합니다.
그렇지 않으면,
A 를 ! ArrayCreate (0)로
설정합니다.
iteratorRecord 를 ? GetIteratorFromMethod (items ,
usingIterator )로 설정합니다.
k 를 0으로 설정합니다.
반복합니다,
k ≥ 253 - 1이면,
error 를 ThrowCompletion (새로
생성된 TypeError 객체)로 설정합니다.
? IteratorClose (iteratorRecord ,
error )를 반환합니다.
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
next 를 ? IteratorStepValue (iteratorRecord )로
설정합니다.
next 가 done 이면,
? Set (A ,
"length" , 𝔽 (k ),
true )을 수행합니다.
A 를 반환합니다.
mapping 이 true 이면,
mappedValue 를 Completion (Call (mapper ,
thisArg , « next , 𝔽 (k ) »))로
설정합니다.
IfAbruptCloseIterator (mappedValue ,
iteratorRecord )를 수행합니다.
그렇지 않으면,
mappedValue 를 next 로 설정합니다.
defineStatus 를 Completion (CreateDataPropertyOrThrow (A ,
Pk , mappedValue ))로 설정합니다.
IfAbruptCloseIterator (defineStatus ,
iteratorRecord )를 수행합니다.
k 를 k + 1로 설정합니다.
참고: items 는 iterable 이 아니므로
array-like 객체 라고 가정합니다.
arrayLike 를 ! ToObject (items )로 설정합니다.
len 을 ? LengthOfArrayLike (arrayLike )로
설정합니다.
IsConstructor (C )가
true 라면,
A 를 ? Construct (C , «
𝔽 (len ) »)로 설정합니다.
그렇지 않으면,
A 를 ? ArrayCreate (len )로
설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ? Get (arrayLike ,
Pk )로 설정합니다.
mapping 이 true 라면,
mappedValue 를 ? Call (mapper ,
thisArg , « kValue , 𝔽 (k ) »)로 설정합니다.
그렇지 않으면,
mappedValue 를 kValue 로 설정합니다.
? CreateDataPropertyOrThrow (A ,
Pk , mappedValue )를 수행합니다.
k 를 k + 1로 설정합니다.
? Set (A ,
"length" , 𝔽 (len ), true )를
수행합니다.
A 를 반환합니다.
참고
이 메서드는 일부러 일반적인 팩토리 메서드로 설계되었습니다. this 값이 반드시 Array 생성자 일
필요는 없습니다. 따라서 이 메서드는
다른 생성자 로 전달되거나 상속될 수 있으며, 단일 숫자 인수로 호출될 수
있습니다.
23.1.2.2 Array.isArray ( arg )
이 함수는 호출될 때 다음 단계들을 수행합니다:
? IsArray (arg )를 반환합니다.
23.1.2.3 Array.of ( ...items )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
len 을 items 의 요소 개수로 설정합니다.
lenNumber 를 𝔽 (len )으로 설정합니다.
C 를 this 값으로 설정합니다.
IsConstructor (C )가
true 라면,
A 를 ? Construct (C , «
lenNumber »)로 설정합니다.
그렇지 않으면,
A 를 ? ArrayCreate (len )로
설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
kValue 를 items [k ]로 설정합니다.
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
? CreateDataPropertyOrThrow (A ,
Pk , kValue )를 수행합니다.
k 를 k + 1로 설정합니다.
? Set (A ,
"length" , lenNumber , true )를 수행합니다.
A 를 반환합니다.
참고
이 메서드는 일부러 일반적인 팩토리 메서드로 설계되었습니다. this 값이 반드시 Array 생성자 일
필요는 없습니다. 따라서 이 메서드는
다른 생성자 로 전달되거나 상속될 수 있으며, 단일 숫자 인수로 호출될 수
있습니다.
23.1.2.4 Array.prototype
Array.prototype의 값은 Array 프로토타입
객체 입니다.
이 프로퍼티는 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false } 속성을 가집니다.
23.1.2.5 get Array [ %Symbol.species% ]
Array[%Symbol.species%]는 접근자 프로퍼티 이며, set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출될 때 다음 단계들을 수행합니다:
this 값을 반환합니다.
이 함수의 "name" 프로퍼티 값은 "get
[Symbol.species]" 입니다.
참고
Array 프로토타입 메서드는 일반적으로 this 값의 생성자 를 사용하여 파생 객체를 생성합니다.
하지만 하위 클래스 생성자 는 %Symbol.species% 프로퍼티를 재정의함으로써
기본 동작을 오버라이드할 수 있습니다.
23.1.3 배열 프로토타입 객체의 프로퍼티
배열 프로토타입 객체 :
%Array.prototype% 입니다.
배열 특수
객체 이며, 해당 객체에 지정된 내부 메서드를 가집니다.
"length" 프로퍼티를 가지며, 초기 값은 +0 𝔽 이고 속성은 { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }입니다.
[[Prototype]] 내부 슬롯을 가지며, 그 값은 %Object.prototype% 입니다.
참고
배열 프로토타입 객체는 배열 특수 객체 로 지정되어 있는데, 이는 ECMAScript
2015 명세 이전에 작성된 ECMAScript 코드와의 호환성을 보장하기 위함입니다.
23.1.3.1 Array.prototype.at ( index )
O 를 ? ToObject (this 값)로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
relativeIndex 를 ? ToIntegerOrInfinity (index )로
설정합니다.
relativeIndex ≥ 0이면,
k 를 relativeIndex 로 설정합니다.
그렇지 않으면,
k 를 len + relativeIndex 로 설정합니다.
k < 0 또는 k ≥ len 이면 undefined 를
반환합니다.
? Get (O , ! ToString (𝔽 (k )))를 반환합니다.
23.1.3.2 Array.prototype.concat ( ...items )
이 메서드는 객체의 배열 요소 뒤에 각 인자의 배열 요소를 담은 배열을 반환합니다.
호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)로
설정합니다.
A 를 ? ArraySpeciesCreate (O , 0)로
설정합니다.
n 을 0으로 설정합니다.
O 를 items 앞에 추가합니다.
items 의 각 요소 E 에 대해, 다음을 수행합니다:
spreadable 를 ? IsConcatSpreadable (E )로
설정합니다.
spreadable 이 true 이면,
len 를 ? LengthOfArrayLike (E )로
설정합니다.
n + len > 253 - 1이면
TypeError 예외를 throw합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
exists 를 ? HasProperty (E ,
Pk )로 설정합니다.
exists 가 true 이면,
subElement 를 ? Get (E ,
Pk )로 설정합니다.
? CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (n )),
subElement )를 수행합니다.
n 을 n + 1로 설정합니다.
k 를 k + 1로 설정합니다.
그렇지 않으면,
참고: E 는 펼쳐지지 않고 단일 항목으로 추가됩니다.
n ≥ 253 - 1이면 TypeError 예외를
throw합니다.
? CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (n )), E )를
수행합니다.
n 을 n + 1로 설정합니다.
? Set (A ,
"length" , 𝔽 (n ), true )를 수행합니다.
A 를 반환합니다.
이 메서드의 "length" 프로퍼티 값은 1 𝔽 입니다.
참고 1
단계 6 에서
"length" 프로퍼티를 명시적으로 설정하는 것은 items 의 마지막 비어 있지 않은 요소에
후행 구멍이 있거나 A 가 내장 배열이 아닐 때 길이가 올바르게 되도록 보장하기 위함입니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.2.1 IsConcatSpreadable ( O )
추상 연산 IsConcatSpreadable은 인수 O (ECMAScript 언어
값 )를 받고, Boolean을 포함하는 정상
완료 또는 throw
완료 중 하나를 반환합니다. 호출 시 다음 단계들을 수행합니다:
O 가 객체가 아니면 false 를
반환합니다.
spreadable 를 ? Get (O ,
%Symbol.isConcatSpreadable% )로
설정합니다.
spreadable 가 undefined 가 아니면 ToBoolean (spreadable )를
반환합니다.
? IsArray (O )를 반환합니다.
23.1.3.3 Array.prototype.constructor
Array.prototype.constructor의 초기 값은 %Array% 입니다.
23.1.3.4 Array.prototype.copyWithin ( target ,
start [ , end ] )
참고 1
end 인수는 선택 사항입니다. 제공되지 않을 경우 this 값의 길이가 사용됩니다.
참고 2
target 이 음수이면 length +
target 으로 처리됩니다. 여기서 length 는 배열의 길이입니다.
start 가 음수이면 length +
start 으로 처리됩니다. end 가 음수이면 length + end 으로 처리됩니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
relativeTarget 를 ? ToIntegerOrInfinity (target )로
설정합니다.
relativeTarget = -∞이면 to 를 0으로 설정합니다.
그렇지 않고 relativeTarget < 0이면 to 를 max (len +
relativeTarget , 0)으로 설정합니다.
그 밖의 경우 to 를 min (relativeTarget ,
len )으로 설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 from 을 0으로 설정합니다.
그렇지 않고 relativeStart < 0이면 from 을 max (len +
relativeStart , 0)으로 설정합니다.
그 밖의 경우 from 을 min (relativeStart ,
len )으로 설정합니다.
end 이 undefined 이면 relativeEnd 를
len 으로 설정하고, 아니면 relativeEnd 를 ? ToIntegerOrInfinity (end )로
설정합니다.
relativeEnd = -∞이면 final 을 0으로 설정합니다.
그렇지 않고 relativeEnd < 0이면 final 을 max (len +
relativeEnd , 0)으로 설정합니다.
그 밖의 경우 final 을 min (relativeEnd , len )으로
설정합니다.
count 를 min (final - from ,
len - to )로 설정합니다.
from < to 이고 to < from +
count 이면,
direction 을 -1로 설정합니다.
from 을 from + count - 1로 설정합니다.
to 를 to + count - 1로 설정합니다.
그렇지 않으면,
direction 을 1로 설정합니다.
count > 0인 동안 반복합니다,
fromKey 를 ! ToString (𝔽 (from ))로
설정합니다.
toKey 를 ! ToString (𝔽 (to ))로 설정합니다.
fromPresent 를 ? HasProperty (O ,
fromKey )로 설정합니다.
fromPresent 이 true 이면,
fromValue 를 ? Get (O ,
fromKey )로 설정합니다.
? Set (O ,
toKey , fromValue , true )를
수행합니다.
그렇지 않으면,
Assert : fromPresent
이 false 임을 확인합니다.
? DeletePropertyOrThrow (O ,
toKey )를 수행합니다.
from 을 from + direction 으로 설정합니다.
to 를 to + direction 으로 설정합니다.
count 를 count - 1로 설정합니다.
O 를 반환합니다.
참고 3
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.5 Array.prototype.entries ( )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
CreateArrayIterator (O ,
key+value )를 반환합니다.
23.1.3.6 Array.prototype.every ( callback [ ,
thisArg ] )
참고 1
callback 은 세 개의 인수를 받고 Boolean 값으로 변환될 수 있는 값을 반환하는 함수여야 합니다.
every는 배열에 존재하는 각 요소에 대해 오름차순으로 callback 을 한 번씩 호출하며,
callback 이 false 를 반환하는 요소를 찾으면 즉시
false 를 반환합니다. 그렇지 않으면 every는
true 를 반환합니다. callback 은 배열에 실제로 존재하는 요소에만 호출되며, 누락된 요소에
대해 호출되지 않습니다.
thisArg 매개변수가 제공되면 각 callback 호출의 this 값으로
사용됩니다. 제공되지 않으면 undefined 가 대신 사용됩니다.
callback 은 세 개의 인수(요소의 값, 요소의 인덱스, 순회 중인 객체)로 호출됩니다.
every는 호출된 객체를 직접 변경하지 않지만, callback 의 호출로 인해 객체가 변경될 수 있습니다.
every가 처리할 요소의 범위는 callback 의 첫 호출 전에 결정됩니다.
every 호출이 시작된 후 배열에 추가된 요소는 callback 에서 방문하지 않습니다. 기존 요소가 변경된
경우 every가 그 요소를 방문할 때의 값이 callback 에 전달됩니다. 호출이 시작된 후 삭제된 요소는
방문하지 않습니다. every는 수학의 "모든 것에 대해(for all)" 한정자와 유사하게 동작하며, 특히 빈 배열에 대해
true 를 반환합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
IsCallable (callback )이
false 이면 TypeError 예외를 throw합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
kValue 를 ? Get (O ,
Pk )로 설정합니다.
testResult 를 ToBoolean (? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »))로 설정합니다.
testResult 가 false 이면
false 를 반환합니다.
k 를 k + 1로 설정합니다.
true 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.7 Array.prototype.fill ( value [ ,
start [ , end ] ] )
참고 1
start 인수는 선택 사항입니다. 제공되지 않을 경우 +0 𝔽 가 사용됩니다.
end 인수는 선택 사항입니다. 제공되지 않을 경우 this 값의 길이가 사용됩니다.
참고 2
start 가 음수이면 length +
start 으로 처리됩니다. 여기서 length 는 배열의 길이입니다.
end 가 음수이면 length +
end 으로 처리됩니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 k 를 0으로 설정합니다.
그렇지 않고 relativeStart < 0이면 k 를 max (len +
relativeStart , 0)으로 설정합니다.
그 밖의 경우 k 를 min (relativeStart ,
len )으로 설정합니다.
end 이 undefined 이면 relativeEnd 를
len 으로 설정하고, 아니면 relativeEnd 를 ? ToIntegerOrInfinity (end )로
설정합니다.
relativeEnd = -∞이면 final 을 0으로 설정합니다.
그렇지 않고 relativeEnd < 0이면 final 을 max (len +
relativeEnd , 0)으로 설정합니다.
그 밖의 경우 final 을 min (relativeEnd , len )으로
설정합니다.
k < final 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
? Set (O , Pk ,
value , true )를 수행합니다.
k 를 k + 1로 설정합니다.
O 를 반환합니다.
참고 3
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.8 Array.prototype.filter ( callback [ ,
thisArg ] )
참고 1
callback 은 세 개의 인수를 받고 Boolean 값으로 변환될 수 있는 값을 반환하는 함수여야 합니다.
filter는 배열에 존재하는 각 요소에 대해 오름차순으로 callback 을 한 번씩 호출하며,
callback 이 true 를 반환하는 값들로 새로운 배열을 만듭니다.
callback 은 배열에 실제로 존재하는 요소에만 호출되며, 누락된 요소에 대해 호출되지 않습니다.
thisArg 매개변수가 제공되면 각 callback 호출의 this 값으로
사용됩니다. 제공되지 않으면 undefined 가 대신 사용됩니다.
callback 은 세 개의 인수(요소의 값, 요소의 인덱스, 순회 중인 객체)로 호출됩니다.
filter는 호출된 객체를 직접 변경하지 않지만, callback 의 호출로 인해 객체가 변경될 수 있습니다.
filter가 처리할 요소의 범위는 callback 의 첫 호출 전에 결정됩니다.
filter 호출이 시작된 후 배열에 추가된 요소는 callback 에서 방문하지 않습니다. 기존 요소가
변경된 경우 filter가 그 요소를 방문할 때의 값이 callback 에 전달됩니다. 호출이 시작된 후
삭제된 요소는 방문하지 않습니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
IsCallable (callback )이
false 이면 TypeError 예외를 throw합니다.
A 를 ? ArraySpeciesCreate (O , 0)로
설정합니다.
k 를 0으로 설정합니다.
to 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
kValue 를 ? Get (O ,
Pk )로 설정합니다.
selected 를 ToBoolean (? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »))로 설정합니다.
selected 이 true 이면,
? CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (to )),
kValue )를 수행합니다.
to 를 to + 1로 설정합니다.
k 를 k + 1로 설정합니다.
A 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.9 Array.prototype.find ( predicate [ ,
thisArg ] )
참고 1
이 메서드는 배열의 각 요소에 대해 오름차순 인덱스 순서로 predicate 를 한 번씩 호출하며,
predicate 가 true 로 변환되는 값을 반환하는 요소를 찾으면 즉시 그 요소 값을
반환합니다. 그렇지 않으면 find는 undefined 를 반환합니다.
자세한 내용은 FindViaPredicate 를 참조하세요.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
findRec 를 ? FindViaPredicate (O ,
len , ascending , predicate ,
thisArg )로 설정합니다.
findRec .[[Value]] 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.10 Array.prototype.findIndex ( predicate [ ,
thisArg ] )
참고 1
이 메서드는 배열의 각 요소에 대해 오름차순 인덱스 순서로 predicate 를 한 번씩 호출하며,
predicate 가 true 로 변환되는 값을 반환하는 요소를 찾으면 즉시 그 요소의 인덱스를
반환합니다. 그렇지 않으면 findIndex는 -1을 반환합니다.
자세한 내용은 FindViaPredicate 를 참조하세요.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
findRec 를 ? FindViaPredicate (O ,
len , ascending , predicate ,
thisArg )로 설정합니다.
findRec .[[Index]] 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.11 Array.prototype.findLast ( predicate [ ,
thisArg ] )
참고 1
이 메서드는 배열의 각 요소에 대해 내림차순 인덱스 순서로 predicate 를 한 번씩 호출하며,
predicate 가 true 로 변환되는 값을 반환하는 요소를 찾으면 즉시 그 요소 값을
반환합니다. 그렇지 않으면 findLast는 undefined 를 반환합니다.
자세한 정보는 FindViaPredicate 를 참조하세요.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
findRec 를 ? FindViaPredicate (O ,
len , descending , predicate ,
thisArg )로 설정합니다.
findRec .[[Value]] 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열 객체일 필요는 없습니다. 따라서 다른 종류의
객체에 메서드로 전달하여 사용할 수 있습니다.
23.1.3.12 Array.prototype.findLastIndex ( predicate [
, thisArg ] )
참고 1
이 메서드는 배열의 각 요소에 대해 내림차순 인덱스 순서로 predicate 를 한 번씩 호출하며,
predicate 가 true 로 변환되는 값을 반환하는 요소를 찾으면 즉시 그 요소의 인덱스를
반환합니다. 그렇지 않으면 findLastIndex는 -1을 반환합니다.
자세한 정보는 FindViaPredicate 를 참조하세요.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
findRec 를 ? FindViaPredicate (O ,
len , descending , predicate ,
thisArg )로 설정합니다.
findRec .[[Index]] 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열 객체일 필요는 없습니다. 따라서 다른 종류의
객체에 메서드로 전달하여 사용할 수 있습니다.
23.1.3.12.1 FindViaPredicate ( O , len ,
direction , predicate , thisArg )
추상 연산 FindViaPredicate는 인수 O (객체), len (음이 아닌 정수 ),
direction (ascending 또는
descending ), predicate (ECMAScript 언어 값 ),
thisArg (ECMAScript 언어 값 )를 받고,
아래와 같은 필드를 가진 Record를 포함하는 정상
완료 또는 throw
완료 중 하나를 반환합니다.
O 는 array-like 객체 또는 TypedArray 여야
합니다.
이 연산은 O 의 각 요소에 대해 오름차순 또는 내림차순 인덱스 순서(direction 에 따라)로
predicate 를 한 번씩 호출하며, predicate 가 true 로 변환되는 값을
반환하는 요소를 찾으면 해당 인덱스와 값을 담은 Record를 반환합니다. 그렇지 않으면 인덱스가
-1 𝔽 이고 값이 undefined 인 Record를 반환합니다.
predicate 는 함수여야 하며, 배열의 각 요소에 대해 호출될 때 요소의 값, 인덱스, 순회 중인 객체를 인수로 전달받고, 반환값은
Boolean으로 변환됩니다.
thisArg 는 predicate 호출 시 this 값으로 사용됩니다.
이 연산은 호출된 객체를 직접 변경하지 않지만, predicate 의 호출로 인해 객체가 변경될 수 있습니다.
처리되는 요소의 범위는 predicate 의 첫 호출 직전에 결정됩니다. 그 이후 배열에 추가된 요소는
predicate 에서 방문하지 않습니다. 기존 요소가 변경된 경우 그 시점의 값이 predicate 에 전달됩니다. 순회
시작 이후 삭제된 요소는 여전히 방문되며 프로토타입에서 조회되거나 undefined 가 됩니다.
호출될 때 다음 단계들을 수행합니다:
IsCallable (predicate )가
false 이면 TypeError 예외를 throw합니다.
direction 이 ascending 이면,
indices 를 0(포함)부터 len (제외)까지의 정수 로 이루어진 구간 의 List 로,
오름차순으로 설정합니다.
그 밖의 경우,
indices 를 0(포함)부터 len (제외)까지의 정수 로 이루어진 구간 의 List 로,
내림차순으로 설정합니다.
indices 의 각 정수 k 에 대해, 다음을 수행합니다:
Pk 를 ! ToString (𝔽 (k ))로
설정합니다.
참고: O 가 TypedArray 일 경우, 이후 Get
호출은 정상 완료를 반환합니다.
kValue 를 ? Get (O ,
Pk )로 설정합니다.
testResult 를 ? Call (predicate ,
thisArg , « kValue , 𝔽 (k ),
O »)로 설정합니다.
ToBoolean (testResult )가
true 이면, Record
{ [[Index]] : 𝔽 (k ), [[Value]] : kValue }를 반환합니다.
Record {
[[Index]] : -1 𝔽 , [[Value]] : undefined }를 반환합니다.
23.1.3.13 Array.prototype.flat ( [ depth ] )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
sourceLen 를 ? LengthOfArrayLike (O )로 설정합니다.
depthNum 을 1로 설정합니다.
depth 가 undefined 가 아니면,
depthNum 을 ? ToIntegerOrInfinity (depth )로
설정합니다.
depthNum < 0이면 depthNum 을 0으로 설정합니다.
A 를 ? ArraySpeciesCreate (O , 0)로
설정합니다.
? FlattenIntoArray (A ,
O , sourceLen , 0, depthNum )를 수행합니다.
A 를 반환합니다.
23.1.3.13.1 FlattenIntoArray ( target ,
source , sourceLen , start , depth [ ,
mapperFunction [ , thisArg ] ] )
추상 연산 FlattenIntoArray는 인수 target (객체), source (객체),
sourceLen (음이 아닌 정수 ), start (음이 아닌 정수 ),
depth (음이 아닌 정수 또는 +∞)와 선택적 인수
mapperFunction (함수 객체 ), thisArg (ECMAScript 언어 값 )를 받고,
음이 아닌 정수를 포함하는 정상
완료 또는 throw
완료 중 하나를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert : mapperFunction 이 존재하면
IsCallable (mapperFunction )이
true 이고, thisArg 가 존재하며, depth 가 1입니다.
targetIndex 를 start 로 설정합니다.
sourceIndex 를 +0 𝔽 로 설정합니다.
ℝ (sourceIndex ) <
sourceLen 인 동안 반복합니다,
P 를 ! ToString (sourceIndex )로
설정합니다.
exists 를 ? HasProperty (source ,
P )로 설정합니다.
exists 가 true 이면,
element 를 ? Get (source ,
P )로 설정합니다.
mapperFunction 이 존재하면,
element 를 ? Call (mapperFunction ,
thisArg , « element ,
sourceIndex , source »)로
설정합니다.
shouldFlatten 을 false 로 설정합니다.
depth > 0이면,
shouldFlatten 을 ? IsArray (element )로
설정합니다.
shouldFlatten 이 true 이면,
depth = +∞이면 newDepth 를 +∞로 설정합니다.
그 밖의 경우 newDepth 를 depth - 1로
설정합니다.
elementLen 를 ? LengthOfArrayLike (element )로
설정합니다.
targetIndex 를 ? FlattenIntoArray (target ,
element , elementLen ,
targetIndex , newDepth )로 설정합니다.
그 밖의 경우,
targetIndex ≥ 253 - 1이면
TypeError 예외를 throw합니다.
? CreateDataPropertyOrThrow (target ,
! ToString (𝔽 (targetIndex )),
element )를 수행합니다.
targetIndex 를 targetIndex + 1로
설정합니다.
sourceIndex 를 sourceIndex +
1 𝔽 로 설정합니다.
targetIndex 를 반환합니다.
23.1.3.14 Array.prototype.flatMap ( mapperFunction [
, thisArg ] )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
sourceLen 를 ? LengthOfArrayLike (O )로 설정합니다.
IsCallable (mapperFunction )이
false 이면 TypeError 예외를 throw합니다.
A 를 ? ArraySpeciesCreate (O , 0)로
설정합니다.
? FlattenIntoArray (A ,
O , sourceLen , 0, 1, mapperFunction ,
thisArg )를 수행합니다.
A 를 반환합니다.
23.1.3.15 Array.prototype.forEach ( callback [ ,
thisArg ] )
참고 1
callback 은 세 개의 인수를 받는 함수여야 합니다.
forEach는 배열에 존재하는 각 요소에 대해 오름차순으로 callback 을 한 번씩 호출합니다.
callback 은 배열에 실제 존재하는 요소에만 호출되며, 누락된 요소에는 호출되지 않습니다.
thisArg 매개변수가 제공되면 각 callback 호출의 this 값으로
사용됩니다. 제공되지 않으면 undefined 가 대신 사용됩니다.
callback 은 세 개의 인수(요소의 값, 요소의 인덱스, 순회 중인 객체)로 호출됩니다.
forEach는 호출된 객체를 직접 변경하지 않지만, callback 의 호출로 인해 객체가 변경될 수
있습니다.
forEach가 처리할 요소의 범위는 callback 의 첫 호출 전에 결정됩니다.
forEach 호출이 시작된 후 배열에 추가된 요소는 callback 에서 방문하지 않습니다. 기존 요소가
변경된 경우 그 시점의 값이 callback 에 전달됩니다. 호출이 시작된 후 삭제된 요소는 방문하지 않습니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
IsCallable (callback )이
false 이면 TypeError 예외를 throw합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
kValue 를 ? Get (O ,
Pk )로 설정합니다.
? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »)를 수행합니다.
k 를 k + 1로 설정합니다.
undefined 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.16 Array.prototype.includes ( searchElement [
, fromIndex ] )
참고 1
이 메서드는 SameValueZero 알고리즘을 사용하여
searchElement 를 배열 요소와 오름차순으로 비교하며, 아무 위치에서라도 찾으면 true 를
반환하고 그렇지 않으면 false 를 반환합니다.
두 번째 인수 fromIndex 는 선택 사항이며 기본값은 +0 𝔽 입니다(즉,
배열 전체를 검색함). 배열 길이보다 크거나 같으면 false 를 반환하며, 검색하지 않습니다.
-0 𝔽 보다 작으면 배열 끝에서의 오프셋으로 사용되어 fromIndex 를
계산합니다. 계산된 인덱스가 +0 𝔽 이하이면 배열 전체가 검색됩니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
len = 0이면 false 를 반환합니다.
n 을 ? ToIntegerOrInfinity (fromIndex )로
설정합니다.
Assert :
fromIndex 가 undefined 이면 n 은 0입니다.
n = +∞이면 false 를 반환합니다.
그 밖의 경우 n = -∞이면 n 을 0으로 설정합니다.
n ≥ 0이면,
k 를 n 으로 설정합니다.
그 밖의 경우,
k 를 len + n 으로 설정합니다.
k < 0이면 k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
elementK 를 ? Get (O ,
! ToString (𝔽 (k )))로 설정합니다.
SameValueZero (searchElement ,
elementK )이 true 이면 true 를
반환합니다.
k 를 k + 1로 설정합니다.
false 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
참고 3
이 메서드는 유사한 indexOf 메서드와 두 가지 방식에서 의도적으로 다릅니다. 첫째로 SameValueZero 알고리즘을 사용하여 IsStrictlyEqual 대신
NaN 배열 요소를 감지할 수 있습니다. 둘째로 누락된 배열 요소를 건너뛰지 않고
undefined 로 처리합니다.
23.1.3.17 Array.prototype.indexOf ( searchElement [ ,
fromIndex ] )
이 메서드는 IsStrictlyEqual 알고리즘을 사용하여
searchElement 를 배열 요소와 오름차순으로 비교하며, 한 곳 이상에서 찾으면 가장 작은 인덱스를 반환하고, 그렇지 않으면
-1 𝔽 를 반환합니다.
참고 1
두 번째 인수 fromIndex 는 선택 사항이며 기본값은 +0 𝔽 입니다(즉,
배열 전체가 검색됨). 배열 길이보다 크거나 같으면 -1 𝔽 를 반환하며, 검색하지 않습니다.
-0 𝔽 보다 작으면 배열 끝에서의 오프셋으로 사용되어 fromIndex 를
계산합니다. 계산된 인덱스가 +0 𝔽 이하이면 배열 전체가 검색됩니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
len = 0이면 -1 𝔽 를 반환합니다.
n 을 ? ToIntegerOrInfinity (fromIndex )로
설정합니다.
Assert :
fromIndex 가 undefined 이면 n 은 0입니다.
n = +∞이면 -1 𝔽 를 반환합니다.
그 밖의 경우 n = -∞이면 n 을 0으로 설정합니다.
n ≥ 0이면,
k 를 n 으로 설정합니다.
그 밖의 경우,
k 를 len + n 으로 설정합니다.
k < 0이면 k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
elementK 를 ? Get (O ,
Pk )로 설정합니다.
IsStrictlyEqual (searchElement ,
elementK )이 true 이면 𝔽 (k )를
반환합니다.
k 를 k + 1로 설정합니다.
-1 𝔽 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.18 Array.prototype.join ( separator )
이 메서드는 배열의 요소들을 문자열로 변환한 후, separator 가 등장하는 구분자로 문자열을 연결합니다. separator가 제공되지 않으면
쉼표 하나가 구분자로 사용됩니다.
호출 시 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
separator 가 undefined 이면 sep 을
"," 로 설정합니다.
그 밖의 경우, sep 를 ? ToString (separator )로 설정합니다.
R 을 빈 문자열로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
k > 0이면 R 에 sep 를 문자열 연결하여 R 에
저장합니다.
element 를 ? Get (O ,
! ToString (𝔽 (k )))로 설정합니다.
element 가 undefined 도 아니고
null 도 아니면,
S 를 ? ToString (element )로
설정합니다.
R 에 S 를 문자열 연결하여 R 에 저장합니다.
k 를 k + 1로 설정합니다.
R 를 반환합니다.
참고
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.19 Array.prototype.keys ( )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
CreateArrayIterator (O ,
key )를 반환합니다.
23.1.3.20 Array.prototype.lastIndexOf ( searchElement
[ , fromIndex ] )
참고 1
이 메서드는 IsStrictlyEqual 알고리즘을 사용하여
searchElement 를 배열 요소와 내림차순으로 비교하며, 한 곳 이상에서 찾으면 가장 큰 인덱스를 반환하고, 그렇지 않으면
-1 𝔽 를 반환합니다.
두 번째 인수 fromIndex 는 선택 사항이며 기본값은 배열 길이 - 1입니다(즉, 배열 전체가 검색됨). 배열 길이보다 크거나
같으면 전체 배열을 검색합니다. -0 𝔽 보다 작으면 배열 끝에서의 오프셋으로 사용되어
fromIndex 를 계산합니다. 계산된 인덱스가 +0 𝔽 이하이면
-1 𝔽 를 반환합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
len = 0이면 -1 𝔽 를 반환합니다.
fromIndex 가 존재하면 n 을 ? ToIntegerOrInfinity (fromIndex )로
설정하고 그렇지 않으면 n 을 len - 1로 설정합니다.
n = -∞이면 -1 𝔽 를 반환합니다.
n ≥ 0이면,
k 를 min (n , len -
1)로 설정합니다.
그 밖의 경우,
k 를 len + n 으로 설정합니다.
k ≥ 0인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
elementK 를 ? Get (O ,
Pk )로 설정합니다.
IsStrictlyEqual (searchElement ,
elementK )이 true 이면 𝔽 (k )를
반환합니다.
k 를 k - 1로 설정합니다.
-1 𝔽 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.21 Array.prototype.map ( callback [ ,
thisArg ] )
참고 1
callback 은 세 개의 인수를 받는 함수여야 합니다.
map은 배열의 각 요소에 대해 오름차순으로 callback 을 한 번씩 호출하며, 결과로 새로운 배열을
만듭니다. callback 은 배열에 실제 존재하는 요소에만 호출되며, 누락된 요소에는 호출되지 않습니다.
thisArg 매개변수가 제공되면 각 callback 호출의 this 값으로
사용됩니다. 제공되지 않으면 undefined 가 대신 사용됩니다.
callback 은 세 개의 인수(요소의 값, 요소의 인덱스, 순회 중인 객체)로 호출됩니다.
map은 호출된 객체를 직접 변경하지 않지만, callback 의 호출로 인해 객체가 변경될 수 있습니다.
map이 처리할 요소의 범위는 callback 의 첫 호출 전에 결정됩니다. map
호출이 시작된 후 배열에 추가된 요소는 callback 에서 방문하지 않습니다. 기존 요소가 변경된 경우 그 시점의 값이
callback 에 전달됩니다. 호출이 시작된 후 삭제된 요소는 방문하지 않습니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
IsCallable (callback )이
false 이면 TypeError 예외를 throw합니다.
A 를 ? ArraySpeciesCreate (O ,
len )로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
kValue 를 ? Get (O ,
Pk )로 설정합니다.
mappedValue 를 ? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »)로 설정합니다.
? CreateDataPropertyOrThrow (A ,
Pk , mappedValue )를 수행합니다.
k 를 k + 1로 설정합니다.
A 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.22 Array.prototype.pop ( )
참고 1
이 메서드는 배열의 마지막 요소를 제거하고 해당 요소를 반환합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
len = 0이면,
? Set (O ,
"length" , +0 𝔽 ,
true )를 수행합니다.
undefined 를 반환합니다.
그 밖의 경우,
Assert : len > 0임을 확인합니다.
newLen 을 𝔽 (len - 1)로 설정합니다.
index 를 ! ToString (newLen )로
설정합니다.
element 를 ? Get (O ,
index )로 설정합니다.
? DeletePropertyOrThrow (O ,
index )를 수행합니다.
? Set (O ,
"length" , newLen , true )를
수행합니다.
element 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.23 Array.prototype.push ( ...items )
참고 1
이 메서드는 인수들을 배열의 끝에 등장 순서대로 추가합니다. 그리고 배열의 새 길이를 반환합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
argCount 를 items 의 요소 개수로 설정합니다.
len + argCount > 253 - 1이면
TypeError 예외를 throw합니다.
items 의 각 요소 E 에 대해 다음을 수행합니다:
? Set (O ,
! ToString (𝔽 (len )),
E , true )를 수행합니다.
len 을 len + 1로 설정합니다.
? Set (O ,
"length" , 𝔽 (len ), true )를
수행합니다.
𝔽 (len )를
반환합니다.
이 메서드의 "length" 프로퍼티 값은 1 𝔽 입니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.24 Array.prototype.reduce ( callback [ ,
initialValue ] )
참고 1
callback 은 네 개의 인수를 받는 함수여야 합니다.
reduce는 배열에 존재하는 첫 번째 요소 이후의 각 요소에 대해 오름차순으로 callback 을 한 번씩
함수로 호출합니다.
callback 은 네 개의 인수(previousValue (이전 callback 호출 값),
currentValue (현재 요소의 값), currentIndex , 순회 중인 객체)를 받아 호출됩니다.
callback 이 처음 호출될 때 previousValue 와 currentValue 는 두
가지 값 중 하나가 될 수 있습니다. reduce 호출 시 initialValue 가 제공되면
previousValue 는 initialValue 이고 currentValue 는 배열의 첫
번째 값이 됩니다. initialValue 가 제공되지 않으면 previousValue 는 배열의 첫 번째 값,
currentValue 는 두 번째 값이 됩니다. 배열에 요소가 없고 initialValue 가 제공되지 않으면
TypeError 가 발생합니다.
reduce는 호출된 객체를 직접 변경하지 않지만, callback 의 호출로 인해 객체가 변경될 수 있습니다.
reduce가 처리할 요소의 범위는 callback 의 첫 호출 전에 결정됩니다.
reduce 호출이 시작된 후 배열에 추가된 요소는 callback 에서 방문하지 않습니다. 기존 요소가
변경된 경우 그 시점의 값이 callback 에 전달됩니다. 호출이 시작된 후 삭제된 요소는 방문하지 않습니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
IsCallable (callback )이
false 이면 TypeError 예외를 throw합니다.
len = 0이고 initialValue 가 제공되지 않으면 TypeError
예외를 throw합니다.
k 를 0으로 설정합니다.
accumulator 를 undefined 로 설정합니다.
initialValue 가 제공되면,
accumulator 를 initialValue 로 설정합니다.
그 밖의 경우,
kPresent 를 false 로 설정합니다.
kPresent 가 false 이고 k <
len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
accumulator 를 ? Get (O ,
Pk )로 설정합니다.
k 를 k + 1로 설정합니다.
kPresent 이 false 이면 TypeError
예외를 throw합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
kValue 를 ? Get (O ,
Pk )로 설정합니다.
accumulator 를 ? Call (callback ,
undefined , « accumulator ,
kValue , 𝔽 (k ),
O »)로 설정합니다.
k 를 k + 1로 설정합니다.
accumulator 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.25 Array.prototype.reduceRight ( callback [ ,
initialValue ] )
참고 1
callback 은 네 개의 인수를 받는 함수여야 합니다.
reduceRight는 배열에 존재하는 첫 번째 요소 이후의 각 요소에 대해 내림차순으로 callback 을
한 번씩 함수로 호출합니다.
callback 은 네 개의 인수(previousValue (이전 callback 호출 값),
currentValue (현재 요소의 값), currentIndex , 순회 중인 객체)를 받아 호출됩니다. 함수가
처음 호출될 때 previousValue 와 currentValue 는 두 가지 값 중 하나가 될 수 있습니다.
reduceRight 호출 시 initialValue 가 제공되면
previousValue 는 initialValue 이고 currentValue 는 배열의 마지막
값이 됩니다. initialValue 가 제공되지 않으면 previousValue 는 배열의 마지막 값,
currentValue 는 마지막에서 두 번째 값이 됩니다. 배열에 요소가 없고 initialValue 가 제공되지
않으면 TypeError 가 발생합니다.
reduceRight는 호출된 객체를 직접 변경하지 않지만, callback 의 호출로 인해 객체가 변경될 수
있습니다.
reduceRight가 처리할 요소의 범위는 callback 의 첫 호출 전에 결정됩니다.
reduceRight 호출이 시작된 후 배열에 추가된 요소는 callback 에서 방문하지 않습니다. 기존
요소가 callback 에 의해 변경된 경우 그 시점의 값이 callback 에 전달됩니다. 호출이 시작된 후
삭제된 요소는 방문하지 않습니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
IsCallable (callback )이
false 이면 TypeError 예외를 throw합니다.
len = 0이고 initialValue 가 제공되지 않으면 TypeError
예외를 throw합니다.
k 를 len - 1로 설정합니다.
accumulator 를 undefined 로 설정합니다.
initialValue 가 제공되면,
accumulator 를 initialValue 로 설정합니다.
그 밖의 경우,
kPresent 를 false 로 설정합니다.
kPresent 가 false 이고 k ≥ 0인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
accumulator 를 ? Get (O ,
Pk )로 설정합니다.
k 를 k - 1로 설정합니다.
kPresent 이 false 이면 TypeError
예외를 throw합니다.
k ≥ 0인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
kValue 를 ? Get (O ,
Pk )로 설정합니다.
accumulator 를 ? Call (callback ,
undefined , « accumulator ,
kValue , 𝔽 (k ),
O »)로 설정합니다.
k 를 k - 1로 설정합니다.
accumulator 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.26 Array.prototype.reverse ( )
참고 1
이 메서드는 배열의 요소들을 순서를 반대로 재배열합니다. 그리고 뒤집힌 배열을 반환합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
middle 를 floor (len / 2)로 설정합니다.
lower 를 0으로 설정합니다.
lower ≠ middle 인 동안 반복합니다,
upper 를 len - lower - 1로 설정합니다.
upperP 를 ! ToString (𝔽 (upper ))로
설정합니다.
lowerP 를 ! ToString (𝔽 (lower ))로
설정합니다.
lowerExists 를 ? HasProperty (O ,
lowerP )로 설정합니다.
lowerExists 이 true 이면,
lowerValue 를 ? Get (O ,
lowerP )로 설정합니다.
upperExists 를 ? HasProperty (O ,
upperP )로 설정합니다.
upperExists 이 true 이면,
upperValue 를 ? Get (O ,
upperP )로 설정합니다.
lowerExists 이 true 이고
upperExists 이 true 이면,
? Set (O ,
lowerP , upperValue , true )를
수행합니다.
? Set (O ,
upperP , lowerValue , true )를
수행합니다.
그 밖의 경우 lowerExists 이 false 이고
upperExists 이 true 이면,
? Set (O ,
lowerP , upperValue , true )를
수행합니다.
? DeletePropertyOrThrow (O ,
upperP )를 수행합니다.
그 밖의 경우 lowerExists 이 true 이고
upperExists 이 false 이면,
? DeletePropertyOrThrow (O ,
lowerP )를 수행합니다.
? Set (O ,
upperP , lowerValue , true )를
수행합니다.
그 밖의 경우,
Assert : lowerExists
와 upperExists 가 모두 false 임을 확인합니다.
참고: 아무 작업도 필요하지 않습니다.
lower 를 lower + 1로 설정합니다.
O 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.27 Array.prototype.shift ( )
이 메서드는 배열의 첫 번째 요소를 제거하고 해당 요소를 반환합니다.
호출 시 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
len = 0이면,
? Set (O ,
"length" , +0 𝔽 ,
true )를 수행합니다.
undefined 를 반환합니다.
first 를 ? Get (O ,
"0" )로 설정합니다.
k 를 1로 설정합니다.
k < len 인 동안 반복합니다,
from 을 ! ToString (𝔽 (k ))로 설정합니다.
to 를 ! ToString (𝔽 (k - 1))로
설정합니다.
fromPresent 를 ? HasProperty (O ,
from )로 설정합니다.
fromPresent 이 true 이면,
fromValue 를 ? Get (O ,
from )로 설정합니다.
? Set (O ,
to , fromValue , true )를
수행합니다.
그 밖의 경우,
Assert : fromPresent
이 false 임을 확인합니다.
? DeletePropertyOrThrow (O ,
to )를 수행합니다.
k 를 k + 1로 설정합니다.
? DeletePropertyOrThrow (O ,
! ToString (𝔽 (len - 1)))를 수행합니다.
? Set (O ,
"length" , 𝔽 (len - 1), true )를
수행합니다.
first 를 반환합니다.
참고
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.28 Array.prototype.slice ( start ,
end )
이 메서드는 배열의 start 요소부터 end 요소 바로 앞까지(혹은 end 가
undefined 이면 배열의 끝까지)의 요소를 포함하는 배열을 반환합니다. start 가 음수면 length + start 로 처리되며, 여기서
length 는 배열의 길이입니다. end 가 음수면 length
+ end 로 처리됩니다. 여기서 length 는 배열의 길이입니다.
호출 시 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 k 를 0으로 설정합니다.
그 밖의 경우 relativeStart < 0이면 k 를 max (len +
relativeStart , 0)으로 설정합니다.
그 밖의 경우 k 를 min (relativeStart ,
len )으로 설정합니다.
end 가 undefined 이면 relativeEnd 를
len 으로 설정하고, 아니면 relativeEnd 를 ? ToIntegerOrInfinity (end )로
설정합니다.
relativeEnd = -∞이면 final 을 0으로 설정합니다.
그 밖의 경우 relativeEnd < 0이면 final 을 max (len +
relativeEnd , 0)으로 설정합니다.
그 밖의 경우 final 을 min (relativeEnd , len )으로
설정합니다.
count 를 max (final - k , 0)으로
설정합니다.
A 를 ? ArraySpeciesCreate (O ,
count )로 설정합니다.
n 을 0으로 설정합니다.
k < final 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
kValue 를 ? Get (O ,
Pk )로 설정합니다.
? CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (n )),
kValue )를 수행합니다.
k 를 k + 1로 설정합니다.
n 을 n + 1로 설정합니다.
? Set (A ,
"length" , 𝔽 (n ), true )를 수행합니다.
A 를 반환합니다.
참고 1
단계 15 에서
"length" 프로퍼티를 명시적으로 설정하는 것은 A 가 내장 배열이 아닌 경우에도 길이가
올바르게 되도록 하기 위함입니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.29 Array.prototype.some ( callback [ ,
thisArg ] )
참고 1
callback 은 세 개의 인수를 받고 Boolean 값으로 변환될 수 있는 값을 반환하는 함수여야 합니다.
some은 배열에 존재하는 각 요소에 대해 오름차순으로 callback 을 한 번씩 호출하며,
callback 이 true 를 반환하는 요소를 찾으면 즉시
true 를 반환합니다. 그렇지 않으면 some은 false 를
반환합니다. callback 은 배열에 실제 존재하는 요소에만 호출되며, 누락된 요소에는 호출되지 않습니다.
thisArg 매개변수가 제공되면 각 callback 호출의 this 값으로
사용됩니다. 제공되지 않으면 undefined 가 대신 사용됩니다.
callback 은 세 개의 인수(요소의 값, 요소의 인덱스, 순회 중인 객체)로 호출됩니다.
some은 호출된 객체를 직접 변경하지 않지만, callback 의 호출로 인해 객체가 변경될 수 있습니다.
some이 처리할 요소의 범위는 callback 의 첫 호출 전에 결정됩니다. some
호출이 시작된 후 배열에 추가된 요소는 callback 에서 방문하지 않습니다. 기존 요소가 변경된 경우 그 시점의 값이
callback 에 전달됩니다. 호출이 시작된 후 삭제된 요소는 방문하지 않습니다. some은 수학의
"존재(exists)" 한정자와 유사하게 동작하며, 특히 빈 배열에 대해 false 를 반환합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
IsCallable (callback )이
false 이면 TypeError 예외를 throw합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
kValue 를 ? Get (O ,
Pk )로 설정합니다.
testResult 를 ToBoolean (? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »))로 설정합니다.
testResult 이 true 이면
true 를 반환합니다.
k 를 k + 1로 설정합니다.
false 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.30 Array.prototype.sort ( comparator )
이 메서드는 배열의 요소를 정렬합니다. comparator 가 undefined 가 아니면 두 개의 인수
x , y 를 받아 x < y 이면 음수 Number, x >
y 이면 양수 Number, 그렇지 않으면 0을 반환하는 함수여야 합니다.
호출 시 다음 단계들을 수행합니다:
comparator 가 undefined 가
아니며 IsCallable (comparator )가
false 이면 TypeError 예외를 throw합니다.
obj 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (obj )로 설정합니다.
SortCompare 를 (x , y )를 매개변수로 하고
comparator 를 캡처하는 새로운 Abstract Closure 로
설정하며, 호출 시 다음을 수행합니다:
? CompareArrayElements (x ,
y , comparator )를 반환합니다.
sortedList 를 ? SortIndexedProperties (obj ,
len , SortCompare , skip-holes )로 설정합니다.
itemCount 를 sortedList 의 요소 개수로 설정합니다.
j 를 0으로 설정합니다.
j < itemCount 인 동안 반복합니다,
? Set (obj ,
! ToString (𝔽 (j )),
sortedList [j ], true )를 수행합니다.
j 를 j + 1로 설정합니다.
참고: 단계 SortIndexedProperties 호출은
skip-holes 를 사용합니다. 나머지 인덱스는 정렬에서 제외된 구멍의 개수를 보존하기 위해 삭제됩니다.
j < len 인 동안 반복합니다,
? DeletePropertyOrThrow (obj ,
! ToString (𝔽 (j )))를 수행합니다.
j 를 j + 1로 설정합니다.
obj 를 반환합니다.
참고 1
존재하지 않는 프로퍼티 값은 항상 undefined 프로퍼티 값보다 크고,
undefined 는 항상 다른 어떤 값보다 크므로(자세한 내용은 CompareArrayElements 참조),
undefined 프로퍼티 값은 항상 결과의 끝으로 정렬되고 그 뒤에 존재하지 않는 프로퍼티 값이 옵니다.
참고 2
단계 ToString 추상 연산 이
단계 5 및 6 에서 수행될 때
SortCompare 가 일관된 비교자 로 동작하지 않을 수도 있습니다.
참고 3
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.30.1 SortIndexedProperties ( obj ,
len , SortCompare , holes )
추상 연산 SortIndexedProperties는 인수 obj (객체), len (음이 아닌 정수 ),
SortCompare (두 개의 매개변수를 가진 Abstract Closure ),
holes (skip-holes 또는
read-through-holes )를 받고, 아래와 같은 값을 담는 정상
완료 또는 throw
완료 중 하나를 반환합니다. 호출 시 다음 단계들을 수행합니다:
items 를 새로 빈 List 로
설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로
설정합니다.
holes 가 skip-holes 이면,
kRead 를 ? HasProperty (obj ,
Pk )로 설정합니다.
그 밖의 경우,
Assert : holes
가 read-through-holes 임을 확인합니다.
kRead 를 true 로 설정합니다.
kRead 이 true 이면,
kValue 를 ? Get (obj ,
Pk )로 설정합니다.
kValue 를 items 에 추가합니다.
k 를 k + 1로 설정합니다.
items 를 구현 정의 순서의
calls to SortCompare 로 정렬합니다. 만약 호출 중
abrupt
completion 이 반환되면 더 이상 SortCompare 를 호출하지 않고 해당
Completion
Record 를 반환합니다.
items 를 반환합니다.
정렬 순서(sort order) 는 위 알고리즘의 단계 4 를
완료한 후 items 의 순서를 의미합니다.
정렬 순서 는
구현 정의 입니다. 만약
SortCompare 가 items 의 원소에 대해 일관된 비교자 가 아닌 경우입니다.
Array.prototype.sort 또는
Array.prototype.toSorted 에서
SortIndexedProperties가 호출될 때, 정렬 순서 는 구현
정의 입니다. 만약 comparator 가 undefined 이고,
ToString 이 SortCompare 에 인수로 넘긴 특정
값에 대해 항상 동일한 결과를 반환하지 않는 경우입니다.
정렬 순서 가
구현 정의 로 지정되지 않은 경우, 다음 조건을 모두 만족해야
합니다:
itemCount 보다 작은 음이 아닌 정수 에 대한 어떤 수학적 순열 π가 존재해야 하며,
itemCount 보다 작은 음이 아닌 정수 j 에 대해 old[j ] 는 new[π(j )] 와 정확히 동일해야 합니다.
itemCount 보다 작은 모든 음이 아닌 정수 j , k 에 대해, ℝ (SortCompare (old[j ],
old[k ])) < 0 이면 π(j )
< π(k ) 가 성립해야 합니다.
itemCount 보다 작은 j , k 에 대해 j <
k , ℝ (SortCompare (old[j ],
old[k ])) = 0 이면 π(j )
< π(k ) 가 성립해야 합니다. 즉, 정렬은 안정적(stable)이어야 합니다.
여기서 old[j ] 는 단계 4 실행
전 items [j ] 을, new[j ] 는 단계 4 실행 후의 items [j ] 을 의미합니다.
추상 클로저나 함수 comparator 가 집합 S 에 대해 일관된 비교자(consistent comparator) 라면, 모든 S 의 값
a , b , c (동일할 수도 있음)에 대해 아래의 조건을 모두 만족해야 합니다. a <C
b 는 ℝ (comparator (a ,
b )) < 0 을, a =C
b 는 ℝ (comparator (a ,
b )) = 0 을, a
>C b 는 ℝ (comparator (a ,
b )) > 0 을 의미합니다.
comparator (a , b )를 호출하면 주어진 a ,
b 쌍에 대해 항상 동일한 값 v 가 반환되어야 하며, v 는 Number 이며
v 는 NaN 이 아니어야 합니다. 즉, a <C
b , a =C b , a >C
b 중 하나만 참입니다.
comparator (a , b )를 호출해도 obj 나
obj 의 프로토타입 체인의 어떤 객체도 수정하면 안 됩니다.
a =C a (반사성)
a =C b 이면 b =C a
(대칭성)
a =C b 이고 b =C c 이면
a =C c (전이성)
a <C b 이고 b <C
c 이면 a <C c (전이성)
a >C b 이고 b >C
c 이면 a >C c (전이성)
참고
위 조건들은 comparator 가 집합 S 를 동치류(equivalence class)로 나누고, 그
동치류들이 완전히 정렬됨을 보장하기 위한 필요충분조건입니다.
23.1.3.30.2 CompareArrayElements ( x ,
y , comparator )
추상 연산 CompareArrayElements는 인수 x (ECMAScript 언어 값 ),
y (ECMAScript 언어 값 ),
comparator (함수 객체 또는 undefined )를
받고, 아래와 같은 값을 담는 정상
완료 또는 abrupt
완료 중 하나를 반환합니다. 호출 시 다음 단계들을 수행합니다:
x 와 y 가 모두 undefined 이면
+0 𝔽 를 반환합니다.
x 가 undefined 이면 1 𝔽 를
반환합니다.
y 가 undefined 이면 -1 𝔽 를
반환합니다.
comparator 가 undefined 가 아니면,
v 를 ? ToNumber (? Call (comparator ,
undefined , « x , y »))로
설정합니다.
v 가 NaN 이면
+0 𝔽 를 반환합니다.
v 를 반환합니다.
xString 를 ? ToString (x )로 설정합니다.
yString 를 ? ToString (y )로 설정합니다.
xSmaller 를 ! IsLessThan (xString ,
yString , true )로 설정합니다.
xSmaller 이 true 이면
-1 𝔽 를 반환합니다.
ySmaller 를 ! IsLessThan (yString ,
xString , true )로 설정합니다.
ySmaller 이 true 이면
1 𝔽 를 반환합니다.
+0 𝔽 를 반환합니다.
23.1.3.31 Array.prototype.splice ( start ,
deleteCount , ...items )
참고 1
이 메서드는 배열에서 start 정수 인덱스 부터 deleteCount 개의 요소를
삭제하고, 그 위치에 items 의 요소들을 대체합니다. 삭제된 요소들을 담은 배열(있는 경우)을 반환합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 actualStart 를 0으로 설정합니다.
그 밖의 경우 relativeStart < 0이면 actualStart 를 max (len
+ relativeStart , 0)으로 설정합니다.
그 밖의 경우 actualStart 를 min (relativeStart ,
len )으로 설정합니다.
itemCount 를 items 의 요소 개수로 설정합니다.
start 가 제공되지 않으면,
actualDeleteCount 를 0으로 설정합니다.
그 밖의 경우 deleteCount 가 제공되지 않으면,
actualDeleteCount 를 len - actualStart 로
설정합니다.
그 밖의 경우,
dc 를 ? ToIntegerOrInfinity (deleteCount )로
설정합니다.
actualDeleteCount 를 클램핑(clamping) 연산으로 dc 를 0
과 len - actualStart 사이로 조정한 결과로 설정합니다.
len + itemCount - actualDeleteCount >
253 - 1이면 TypeError 예외를 throw합니다.
A 를 ? ArraySpeciesCreate (O ,
actualDeleteCount )로 설정합니다.
k 를 0으로 설정합니다.
k < actualDeleteCount 인 동안 반복합니다,
from 을 ! ToString (𝔽 (actualStart +
k ))로 설정합니다.
? HasProperty (O ,
from )이 true 이면,
fromValue 를 ? Get (O ,
from )로 설정합니다.
? CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (k )),
fromValue )를 수행합니다.
k 를 k + 1로 설정합니다.
? Set (A ,
"length" , 𝔽 (actualDeleteCount ),
true )를 수행합니다.
itemCount < actualDeleteCount 이면,
k 를 actualStart 로 설정합니다.
k < (len -
actualDeleteCount )인 동안 반복합니다,
from 을 ! ToString (𝔽 (k +
actualDeleteCount ))로 설정합니다.
to 를 ! ToString (𝔽 (k +
itemCount ))로 설정합니다.
? HasProperty (O ,
from )이 true 이면,
fromValue 를 ? Get (O ,
from )로 설정합니다.
? Set (O ,
to , fromValue ,
true )를 수행합니다.
그 밖의 경우,
? DeletePropertyOrThrow (O ,
to )를 수행합니다.
k 를 k + 1로 설정합니다.
k 를 len 으로 설정합니다.
k > (len -
actualDeleteCount + itemCount )인 동안 반복합니다,
? DeletePropertyOrThrow (O ,
! ToString (𝔽 (k - 1)))를 수행합니다.
k 를 k - 1로 설정합니다.
그 밖의 경우 itemCount > actualDeleteCount 이면,
k 를 (len - actualDeleteCount )로 설정합니다.
k > actualStart 인 동안 반복합니다,
from 을 ! ToString (𝔽 (k +
actualDeleteCount - 1))로 설정합니다.
to 를 ! ToString (𝔽 (k +
itemCount - 1))로 설정합니다.
? HasProperty (O ,
from )이 true 이면,
fromValue 를 ? Get (O ,
from )로 설정합니다.
? Set (O ,
to , fromValue ,
true )를 수행합니다.
그 밖의 경우,
? DeletePropertyOrThrow (O ,
to )를 수행합니다.
k 를 k - 1로 설정합니다.
k 를 actualStart 로 설정합니다.
items 의 각 요소 E 에 대해, 다음을 수행합니다:
? Set (O ,
! ToString (𝔽 (k )),
E , true )를 수행합니다.
k 를 k + 1로 설정합니다.
? Set (O ,
"length" , 𝔽 (len - actualDeleteCount +
itemCount ), true )를 수행합니다.
A 를 반환합니다.
참고 2
단계 15 및 20 에서
"length" 프로퍼티를 명시적으로 설정하는 것은 객체가 내장 배열이 아닐 때에도 길이가 올바르게 되도록 보장하기
위함입니다.
참고 3
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.32 Array.prototype.toLocaleString ( [
reserved1 [ , reserved2 ] ] )
ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 이 메서드는 ECMA-402 명세에 따라 구현되어야 합니다. ECMAScript 구현이
ECMA-402 API를 포함하지 않는 경우 다음 명세가 사용됩니다.
참고 1
ECMA-402의 첫 번째 판에는 이 메서드의 대체 명세가 포함되지 않았습니다.
이 메서드의 선택적 파라미터의 의미는 ECMA-402 명세에서 정의되며, ECMA-402를 지원하지 않는 구현에서는 해당 파라미터 위치를 다른 용도로 사용해서는 안
됩니다.
이 메서드는 호출될 때 다음 단계를 수행합니다:
array 를 ? ToObject (this 값)으로
설정합니다.
len 을 ? LengthOfArrayLike (array )로
설정합니다.
separator 를 구현 정의
리스트 구분자 문자열 값(예: ", " )으로, 호스트 환경 의 현재 로케일에 맞게
설정합니다.
R 을 빈 문자열로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
k > 0이면 R 을 R 과 separator 를
문자열 연결 한 값으로 설정합니다.
element 를 ? Get (array ,
! ToString (𝔽 (k )))로 설정합니다.
element 가 undefined 도 아니고
null 도 아니면,
S 를 ? ToString (? Invoke (element ,
"toLocaleString" ))로 설정합니다.
R 을 R 과 S 를 문자열 연결 한 값으로
설정합니다.
k 를 k + 1로 설정합니다.
R 을 반환합니다.
참고 2
이 메서드는 배열의 각 요소의 toLocaleString 메서드를 사용하여 문자열로 변환하고, 구현 정의 로케일 민감 구분자
문자열로 연결합니다. 이 메서드는 toString과 유사하지만, 호스트 환경의 현재 로케일 관습에 맞는 로케일 민감 결과를
생성하기 위함입니다.
참고 3
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.33 Array.prototype.toReversed ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 을 ? LengthOfArrayLike (O )로 설정합니다.
A 를 ? ArrayCreate (len )로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
from 을 ! ToString (𝔽 (len -
k - 1))로 설정합니다.
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
fromValue 를 ? Get (O ,
from )로 설정합니다.
! CreateDataPropertyOrThrow (A ,
Pk , fromValue )를 수행합니다.
k 를 k + 1로 설정합니다.
A 를 반환합니다.
23.1.3.34 Array.prototype.toSorted ( comparator )
이 메서드는 호출될 때 다음 단계를 수행합니다:
comparator 가 undefined 가 아니며 IsCallable (comparator )가
false 이면 TypeError 예외를 throw합니다.
O 를 ? ToObject (this 값)으로
설정합니다.
len 을 ? LengthOfArrayLike (O )로 설정합니다.
A 를 ? ArrayCreate (len )로 설정합니다.
SortCompare 를 (x , y )를 매개변수로 하고
comparator 를 캡처하는 새로운 Abstract Closure 로
설정하며, 호출 시 다음을 수행합니다:
? CompareArrayElements (x ,
y , comparator )를 반환합니다.
sortedList 를 ? SortIndexedProperties (O ,
len , SortCompare , read-through-holes )로
설정합니다.
j 를 0으로 설정합니다.
j < len 인 동안 반복합니다,
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (j )),
sortedList [j ])를 수행합니다.
j 를 j + 1로 설정합니다.
A 를 반환합니다.
23.1.3.35 Array.prototype.toSpliced ( start ,
skipCount , ...items )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 actualStart 를 0으로 설정합니다.
그 밖의 경우 relativeStart < 0이면 actualStart 를 max (len
+ relativeStart , 0)으로 설정합니다.
그 밖의 경우 actualStart 를 min (relativeStart ,
len )으로 설정합니다.
insertCount 를 items 의 요소 개수로 설정합니다.
start 가 제공되지 않으면,
actualSkipCount 를 0으로 설정합니다.
그 밖의 경우 skipCount 가 제공되지 않으면,
actualSkipCount 를 len - actualStart 로 설정합니다.
그 밖의 경우,
sc 를 ? ToIntegerOrInfinity (skipCount )로
설정합니다.
actualSkipCount 를 클램핑 연산으로 sc 를 0과
len - actualStart 사이로 조정한 값으로 설정합니다.
newLen 를 len + insertCount -
actualSkipCount 로 설정합니다.
newLen > 253 - 1이면 TypeError 예외를
throw합니다.
A 를 ? ArrayCreate (newLen )로
설정합니다.
i 를 0으로 설정합니다.
r 를 actualStart + actualSkipCount 로 설정합니다.
i < actualStart 인 동안 반복합니다,
Pi 를 ! ToString (𝔽 (i ))로 설정합니다.
iValue 를 ? Get (O , Pi )로
설정합니다.
! CreateDataPropertyOrThrow (A ,
Pi , iValue )를 수행합니다.
i 를 i + 1로 설정합니다.
items 의 각 요소 E 에 대해, 다음을 수행합니다:
Pi 를 ! ToString (𝔽 (i ))로 설정합니다.
! CreateDataPropertyOrThrow (A ,
Pi , E )를 수행합니다.
i 를 i + 1로 설정합니다.
i < newLen 인 동안 반복합니다,
Pi 를 ! ToString (𝔽 (i ))로 설정합니다.
from 을 ! ToString (𝔽 (r ))로 설정합니다.
fromValue 를 ? Get (O ,
from )로 설정합니다.
! CreateDataPropertyOrThrow (A ,
Pi , fromValue )를 수행합니다.
i 를 i + 1로 설정합니다.
r 를 r + 1로 설정합니다.
A 를 반환합니다.
23.1.3.36 Array.prototype.toString ( )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
array 를 ? ToObject (this 값)으로
설정합니다.
func 를 ? Get (array ,
"join" )로 설정합니다.
IsCallable (func )이
false 이면 func 를 내장 함수 %Object.prototype.toString%으로
설정합니다.
? Call (func , array )를
반환합니다.
참고
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.37 Array.prototype.unshift ( ...items )
이 메서드는 인수들을 배열의 시작 부분에 추가하며, 배열 내에서의 순서는 인수 목록에 나타나는 순서와 동일합니다.
호출 시 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
argCount 를 items 의 요소 개수로 설정합니다.
argCount > 0이면,
len + argCount > 253 - 1이면
TypeError 예외를 throw합니다.
k 를 len 으로 설정합니다.
k > 0인 동안 반복합니다,
from 을 ! ToString (𝔽 (k - 1))로 설정합니다.
to 를 ! ToString (𝔽 (k +
argCount - 1))로 설정합니다.
fromPresent 를 ? HasProperty (O ,
from )로 설정합니다.
fromPresent 이 true 이면,
fromValue 를 ? Get (O ,
from )로 설정합니다.
? Set (O ,
to , fromValue ,
true )를 수행합니다.
그 밖의 경우,
Assert :
fromPresent 이 false 임을 확인합니다.
? DeletePropertyOrThrow (O ,
to )를 수행합니다.
k 를 k - 1로 설정합니다.
j 를 +0 𝔽 로 설정합니다.
items 의 각 요소 E 에 대해 다음을 수행합니다:
? Set (O ,
! ToString (j ),
E , true )를 수행합니다.
j 를 j +
1 𝔽 로 설정합니다.
? Set (O ,
"length" , 𝔽 (len + argCount ),
true )를 수행합니다.
𝔽 (len +
argCount )를 반환합니다.
이 메서드의 "length" 프로퍼티 값은 1 𝔽 입니다.
참고
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.38 Array.prototype.values ( )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
CreateArrayIterator (O ,
value )를 반환합니다.
23.1.3.39 Array.prototype.with ( index ,
value )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
relativeIndex 를 ? ToIntegerOrInfinity (index )로
설정합니다.
relativeIndex ≥ 0이면 actualIndex 를 relativeIndex 로
설정합니다.
그 밖의 경우 actualIndex 를 len + relativeIndex 로 설정합니다.
actualIndex ≥ len 또는 actualIndex < 0이면
RangeError 예외를 throw합니다.
A 를 ? ArrayCreate (len )로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
k = actualIndex 이면 fromValue 를
value 로 설정합니다.
그 밖의 경우 fromValue 를 ? Get (O , Pk )로
설정합니다.
! CreateDataPropertyOrThrow (A ,
Pk , fromValue )를 수행합니다.
k 를 k + 1로 설정합니다.
A 를 반환합니다.
23.1.3.40 Array.prototype [ %Symbol.iterator% ] ( )
%Symbol.iterator% 프로퍼티의 초기 값은
23.1.3.38 에서 정의된
%Array.prototype.values%입니다.
23.1.3.41 Array.prototype [ %Symbol.unscopables% ]
%Symbol.unscopables% 데이터
프로퍼티 의 초기 값은 다음 단계로 생성된 객체입니다:
unscopableList 를 OrdinaryObjectCreate (null )로
설정합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"at" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"copyWithin" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"entries" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"fill" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"find" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"findIndex" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"findLast" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"findLastIndex" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"flat" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"flatMap" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"includes" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"keys" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"toReversed" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"toSorted" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"toSpliced" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"values" , true )를 수행합니다.
unscopableList 를 반환합니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }입니다.
참고
이 객체의 자신의 프로퍼티 이름들은 ECMAScript 2015 명세 이전에 Array.prototype의 표준 프로퍼티로
포함되지 않았던 프로퍼티 이름입니다. 이러한 이름들은 with 문 바인딩에서 무시되어, 외부 스코프에서 해당 이름을 바인딩으로
사용하는 기존 코드의 동작을 보존하기 위해 with 문에서 바인딩 객체가 배열일 때 그림자(shadow) 처리됩니다.
"with" 이 unscopableList 에 포함되지 않는 이유는 이미 예약어 이기 때문입니다.
23.1.4 배열 인스턴스의 프로퍼티
배열 인스턴스는 배열
이국 객체(Array exotic objects) 이며, 해당 객체에 지정된 내부 메서드를 가집니다. 배열 인스턴스는
Array 프로토타입 객체 로부터
프로퍼티를 상속받습니다.
배열 인스턴스는 "length" 프로퍼티와 배열 인덱스(array index) 이름을 가진 일련의 열거 가능한 프로퍼티를 가집니다.
23.1.4.1 length
배열 인스턴스의 "length" 프로퍼티는 데이터 프로퍼티 로, 그 값은 항상 모든 구성 가능한
자신의 배열 인덱스(array
index) 이름보다 숫자적으로 큽니다.
"length" 프로퍼티의 초기 속성은 { [[Writable]] :
true , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
참고
"length" 프로퍼티 값을 줄이면 이전 값과 새 값 사이에 있는 자신의 배열 요소가 삭제됩니다. 단, 구성 불가능한
프로퍼티는 삭제할 수 없습니다. 배열의 "length" 프로퍼티를 기존의 구성 불가능한 배열
인덱스(array-indexed) 프로퍼티의 가장 큰 숫자 이름 이하의 값으로 설정하려고 하면, 길이는 해당
구성 불가능한 숫자 자신의 프로퍼티 이름 보다 1 큰 숫자 값으로 설정됩니다. 자세한 내용은
10.4.2.1 을
참조하세요.
23.1.5 배열 이터레이터 객체
배열
이터레이터(Array Iterator) 는 특정 배열 인스턴스 객체에 대한 특정 반복(iteration)을 나타내는 객체입니다. 배열 이터레이터 객체에 대한
명명된 생성자(constructor) 는 존재하지 않습니다. 대신, 배열 이터레이터 객체는 배열 인스턴스
객체의 특정 메서드를 호출하여 생성됩니다.
23.1.5.1 CreateArrayIterator ( array , kind
)
추상 연산 CreateArrayIterator는 인수 array (객체)와
kind (key+value , key , 또는
value )를 받아 객체를 반환합니다. 이 연산은 해당 이터레이터
객체 를 반환하는 배열 메서드에서 이터레이터 객체를 생성할 때 사용됩니다. 호출 시 다음 단계들을 수행합니다:
iterator 를 OrdinaryObjectCreate (%ArrayIteratorPrototype% ,
« [[IteratedArrayLike]] , [[ArrayLikeNextIndex]] , [[ArrayLikeIterationKind]] »)로 설정합니다.
iterator .[[IteratedArrayLike]] 를
array 로 설정합니다.
iterator .[[ArrayLikeNextIndex]] 를 0으로 설정합니다.
iterator .[[ArrayLikeIterationKind]] 를
kind 로 설정합니다.
iterator 를 반환합니다.
23.1.5.2 %ArrayIteratorPrototype% 객체
%ArrayIteratorPrototype% 객체:
23.1.5.2.1 %ArrayIteratorPrototype%.next ( )
O 를 this 값으로 설정합니다.
O 가 객체가 아니면
TypeError 예외를 throw합니다.
O 가 배열 이터레이터 인스턴스의 모든 내부
슬롯을 가지고 있지 않으면 TypeError 예외를 throw합니다.
array 를 O .[[IteratedArrayLike]] 로
설정합니다.
array 가 undefined 이면 CreateIteratorResultObject (undefined ,
true )를 반환합니다.
index 를 O .[[ArrayLikeNextIndex]] 로
설정합니다.
kind 를 O .[[ArrayLikeIterationKind]] 로 설정합니다.
array 가 [[TypedArrayName]] 내부 슬롯을 가지고 있다면,
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (array ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (taRecord )가
true 이면 TypeError 예외를 throw합니다.
len 을 TypedArrayLength (taRecord )로
설정합니다.
그 밖의 경우,
len 를 ? LengthOfArrayLike (array )로
설정합니다.
index ≥ len 이면,
O .[[IteratedArrayLike]] 를
undefined 로 설정합니다.
CreateIteratorResultObject (undefined ,
true )를 반환합니다.
O .[[ArrayLikeNextIndex]] 를 index +
1로 설정합니다.
indexNumber 를 𝔽 (index )로 설정합니다.
kind 가 key 이면,
result 를 indexNumber 로 설정합니다.
그 밖의 경우,
elementKey 를 ! ToString (indexNumber )로
설정합니다.
elementValue 를 ? Get (array ,
elementKey )로 설정합니다.
kind 가 value 이면,
result 를 elementValue 로 설정합니다.
그 밖의 경우,
Assert : kind 가
key+value 임을 확인합니다.
result 를 CreateArrayFromList («
indexNumber , elementValue »)로 설정합니다.
CreateIteratorResultObject (result ,
false )를 반환합니다.
23.1.5.2.2 %ArrayIteratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기 값은
문자열 값 "Array Iterator" 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] :
false , [[Configurable]] :
true }입니다.
23.1.5.3 배열 이터레이터 인스턴스의 프로퍼티
배열 이터레이터 인스턴스는 일반
객체 이며, %ArrayIteratorPrototype%
내재 객체로부터 프로퍼티를 상속받습니다. 배열 이터레이터 인스턴스는 표 74 에 나열된 내부
슬롯으로 초기화됩니다.
표 74: 배열 이터레이터 인스턴스의 내부 슬롯
내부 슬롯
타입
설명
[[IteratedArrayLike]]
객체 또는 undefined
반복 중인 배열 유사 객체(array-like
object)
입니다.
[[ArrayLikeNextIndex]]
0 이상의 정수
해당 이터레이터 에서 다음으로 검사할
정수 인덱스 입니다.
[[ArrayLikeIterationKind]]
key+value , key , 또는
value
반복의 각 요소에 대해 반환되는 값을 식별하는 값입니다.
23.2 TypedArray 객체
TypedArray 는 기본 이진 데이터 버퍼(25.1 )에 대한 배열 유사 뷰를 제공합니다. TypedArray 요소 타입 은 TypedArray
인스턴스의 모든 요소가 가지는 기본 이진 스칼라 데이터 타입입니다. 지원되는 각 요소 타입마다 생성자 가 별도로 존재하며, 이는 표 75 에 나열되어 있습니다. 표 75 의 각 생성자 마다 별도의 프로토타입 객체가
존재합니다.
표 75: TypedArray 생성자들
생성자 이름 및 내재 객체
요소 타입
요소 크기
변환 연산
설명
Int8Array
%Int8Array%
int8
1
ToInt8
8비트 2의 보수 부호 있는 정수
Uint8Array
%Uint8Array%
uint8
1
ToUint8
8비트 부호 없는 정수
Uint8ClampedArray
%Uint8ClampedArray%
uint8clamped
1
ToUint8Clamp
8비트 부호 없는 정수 (클램프 변환)
Int16Array
%Int16Array%
int16
2
ToInt16
16비트 2의 보수 부호 있는 정수
Uint16Array
%Uint16Array%
uint16
2
ToUint16
16비트 부호 없는 정수
Int32Array
%Int32Array%
int32
4
ToInt32
32비트 2의 보수 부호 있는 정수
Uint32Array
%Uint32Array%
uint32
4
ToUint32
32비트 부호 없는 정수
BigInt64Array
%BigInt64Array%
bigint64
8
ToBigInt64
64비트 2의 보수 부호 있는 정수
BigUint64Array
%BigUint64Array%
biguint64
8
ToBigUint64
64비트 부호 없는 정수
Float16Array
%Float16Array%
float16
2
16비트 IEEE 부동 소수점
Float32Array
%Float32Array%
float32
4
32비트 IEEE 부동 소수점
Float64Array
%Float64Array%
float64
8
64비트 IEEE 부동 소수점
아래 정의에서 TypedArray 라는 참조는 위 표에서 해당되는 생성자 이름으로 치환되어야 합니다.
23.2.1 %TypedArray% 내재 객체
%TypedArray% 내재 객체:
모든 TypedArray 생성자 객체가 상속하는 함수 객체 생성자 입니다.
해당 프로토타입 객체와 함께, 모든 TypedArray 생성자 와 그 인스턴스가 상속하는 공통 프로퍼티를 제공합니다.
전역
객체 의 프로퍼티로 나타나거나 전역 이름을 가지지 않습니다.
다양한 TypedArray 생성자 의 추상 상위 클래스 역할을 합니다.
추상 클래스 생성자 이므로 호출 시 오류를 throw합니다.
TypedArray 생성자 들은 super 호출을 수행하지 않습니다.
23.2.1.1 %TypedArray% ( )
이 함수는 호출될 때 다음 단계들을 수행합니다:
TypeError 예외를 throw합니다.
이 함수의 "length" 프로퍼티 값은
+0 𝔽 입니다.
23.2.2 %TypedArray% 내재 객체의 프로퍼티
%TypedArray% 내재 객체:
23.2.2.1 %TypedArray%.from ( source [ ,
mapper [ , thisArg ] ] )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
C 를 this 값으로 설정합니다.
IsConstructor (C )가
false 이면 TypeError 예외를 throw합니다.
mapper 가 undefined 이면,
mapping 을 false 로 설정합니다.
그 밖의 경우,
IsCallable (mapper )
가 false 이면 TypeError 예외를 throw합니다.
mapping 을 true 로 설정합니다.
usingIterator 를 ? GetMethod (source , %Symbol.iterator% )로 설정합니다.
usingIterator 가 undefined 가 아니면,
values 를 ? IteratorToList (? GetIteratorFromMethod (source ,
usingIterator ))로 설정합니다.
len 을 values 의 요소 개수로 설정합니다.
targetObj 를 ? TypedArrayCreateFromConstructor (C ,
« 𝔽 (len ) »)로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 values 의 첫 번째 요소로 설정합니다.
values 의 첫 번째 요소를 제거합니다.
mapping 이 true 이면,
mappedValue 를 ? Call (mapper ,
thisArg , « kValue , 𝔽 (k ) »)로
설정합니다.
그 밖의 경우,
mappedValue 를 kValue 로 설정합니다.
? Set (targetObj ,
Pk , mappedValue , true )를
수행합니다.
k 를 k + 1로 설정합니다.
Assert : values 는 이제 빈
List 입니다.
targetObj 를 반환합니다.
참고: source 는 iterable 객체 가 아니므로, 이미
배열 유사 객체 라고 가정합니다.
arrayLike 를 ! ToObject (source )로 설정합니다.
len 를 ? LengthOfArrayLike (arrayLike )로
설정합니다.
targetObj 를 ? TypedArrayCreateFromConstructor (C ,
« 𝔽 (len ) »)로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ? Get (arrayLike ,
Pk )로 설정합니다.
mapping 이 true 이면,
mappedValue 를 ? Call (mapper ,
thisArg , « kValue , 𝔽 (k ) »)로 설정합니다.
그 밖의 경우,
mappedValue 를 kValue 로 설정합니다.
? Set (targetObj ,
Pk , mappedValue , true )를 수행합니다.
k 를 k + 1로 설정합니다.
targetObj 를 반환합니다.
23.2.2.2 %TypedArray%.of ( ...items )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
len 을 items 의 요소 개수로 설정합니다.
C 를 this 값으로 설정합니다.
IsConstructor (C )가
false 이면 TypeError 예외를 throw합니다.
newObj 를 ? TypedArrayCreateFromConstructor (C ,
« 𝔽 (len ) »)로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
kValue 를 items [k ]로 설정합니다.
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
? Set (newObj ,
Pk , kValue , true )를 수행합니다.
k 를 k + 1로 설정합니다.
newObj 를 반환합니다.
23.2.2.3 %TypedArray%.prototype
%TypedArray% .prototype
의 초기 값은 %TypedArray% 프로토타입
객체 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
23.2.2.4 get %TypedArray% [ %Symbol.species% ]
%TypedArray% [%Symbol.species%]
는 접근자
프로퍼티(accessor property) 로, set 접근자 함수는
undefined 입니다.
get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
this 값을 반환합니다.
이 함수의 "name" 프로퍼티 값은 "get [Symbol.species]" 입니다.
참고
%TypedArray.prototype%
메서드는 일반적으로 this 값의 생성자 를 사용해 파생 객체를 생성합니다.
하지만 서브클래스 생성자 는 %Symbol.species% 프로퍼티를 재정의하여
기본 동작을 오버라이드할 수 있습니다.
23.2.3 %TypedArray% 프로토타입 객체의 프로퍼티
%TypedArray% 프로토타입 객체 :
[[Prototype]] 내부 슬롯의 값은 %Object.prototype% 입니다.
%TypedArray.prototype% 입니다.
일반
객체 입니다.
TypedArray 인스턴스 객체에만 특정한 [[ViewedArrayBuffer]] 나 기타 내부
슬롯을 가지지 않습니다.
23.2.3.1 %TypedArray%.prototype.at ( index )
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
relativeIndex 를 ? ToIntegerOrInfinity (index )로
설정합니다.
relativeIndex ≥ 0이면,
k 를 relativeIndex 로 설정합니다.
그 밖의 경우,
k 를 len + relativeIndex 로 설정합니다.
k < 0 또는 k ≥ len 이면 undefined 를
반환합니다.
! Get (O , ! ToString (𝔽 (k )))를 반환합니다.
23.2.3.2 get %TypedArray%.prototype.buffer
%TypedArray% .prototype.buffer
는 접근자
프로퍼티 이며, set 접근자 함수는 undefined 입니다.
get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[TypedArrayName]] )를 수행합니다.
Assert :
O 는 [[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
buffer 를 O .[[ViewedArrayBuffer]] 로
설정합니다.
buffer 를 반환합니다.
23.2.3.3 get %TypedArray%.prototype.byteLength
%TypedArray% .prototype.byteLength
는 접근자
프로퍼티 이며, set 접근자 함수는 undefined 입니다.
get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[TypedArrayName]] )를 수행합니다.
Assert :
O 는 [[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
seq-cst )로 설정합니다.
size 를 TypedArrayByteLength (taRecord )로
설정합니다.
𝔽 (size )를 반환합니다.
23.2.3.4 get %TypedArray%.prototype.byteOffset
%TypedArray% .prototype.byteOffset
는 접근자
프로퍼티 이며, set 접근자 함수는 undefined 입니다.
get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[TypedArrayName]] )를 수행합니다.
Assert :
O 는 [[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 +0 𝔽 를 반환합니다.
offset 을 O .[[ByteOffset]] 로 설정합니다.
𝔽 (offset )을 반환합니다.
23.2.3.5 %TypedArray%.prototype.constructor
%TypedArray% .prototype.constructor
의 초기 값은 %TypedArray% 입니다.
23.2.3.6 %TypedArray%.prototype.copyWithin ( target ,
start [ , end ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.4 에 정의된
Array.prototype.copyWithin과 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
relativeTarget 를 ? ToIntegerOrInfinity (target )로
설정합니다.
relativeTarget = -∞이면 targetIndex 를 0으로 설정합니다.
그 밖의 경우 relativeTarget < 0이면 targetIndex 를 max (len
+ relativeTarget , 0)으로 설정합니다.
그 밖의 경우 targetIndex 를 min (relativeTarget ,
len )로 설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 startIndex 를 0으로 설정합니다.
그 밖의 경우 relativeStart < 0이면 startIndex 를 max (len
+ relativeStart , 0)으로 설정합니다.
그 밖의 경우 startIndex 를 min (relativeStart ,
len )로 설정합니다.
end 가 undefined 이면 relativeEnd 를
len 으로 설정하고, 아니면 relativeEnd 를 ? ToIntegerOrInfinity (end )로
설정합니다.
relativeEnd = -∞이면 endIndex 를 0으로 설정합니다.
그 밖의 경우 relativeEnd < 0이면 endIndex 를 max (len
+ relativeEnd , 0)으로 설정합니다.
그 밖의 경우 endIndex 를 min (relativeEnd , len )로
설정합니다.
count 를 min (endIndex -
startIndex , len - targetIndex )로 설정합니다.
count > 0이면,
참고: 복사는 소스 데이터의 비트 레벨 인코딩을 보존하는 방식으로 수행되어야 합니다.
buffer 를 O .[[ViewedArrayBuffer]] 로 설정합니다.
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 TypeError 예외를 throw합니다.
len 을 TypedArrayLength (taRecord )로
설정합니다.
elementSize 를 TypedArrayElementSize (O )로
설정합니다.
byteOffset 을 O .[[ByteOffset]] 로
설정합니다.
bufferByteLimit 을 (len × elementSize )
+ byteOffset 로 설정합니다.
toByteIndex 를 (targetIndex ×
elementSize ) + byteOffset 로 설정합니다.
fromByteIndex 를 (startIndex ×
elementSize ) + byteOffset 로 설정합니다.
countBytes 를 count × elementSize 로 설정합니다.
fromByteIndex < toByteIndex 이고
toByteIndex < fromByteIndex +
countBytes 이면,
direction 을 -1로 설정합니다.
fromByteIndex 를 fromByteIndex +
countBytes - 1로 설정합니다.
toByteIndex 를 toByteIndex +
countBytes - 1로 설정합니다.
그 밖의 경우,
direction 을 1로 설정합니다.
countBytes > 0인 동안 반복합니다,
fromByteIndex < bufferByteLimit 이고
toByteIndex < bufferByteLimit 이면,
value 를 GetValueFromBuffer (buffer ,
fromByteIndex , uint8 ,
true , unordered )로
설정합니다.
SetValueInBuffer (buffer ,
toByteIndex , uint8 ,
value , true ,
unordered )를 수행합니다.
fromByteIndex 를 fromByteIndex +
direction 로 설정합니다.
toByteIndex 를 toByteIndex +
direction 로 설정합니다.
countBytes 를 countBytes - 1로 설정합니다.
그 밖의 경우,
countBytes 를 0으로 설정합니다.
O 를 반환합니다.
23.2.3.7 %TypedArray%.prototype.entries ( )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? ValidateTypedArray (O ,
seq-cst )를 수행합니다.
CreateArrayIterator (O ,
key+value )를 반환합니다.
23.2.3.8 %TypedArray%.prototype.every ( callback [ ,
thisArg ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.6 에 정의된
Array.prototype.every와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
IsCallable (callback )가
false 이면 TypeError 예외를 throw합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ! Get (O , Pk )로
설정합니다.
testResult 를 ToBoolean (? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »))로 설정합니다.
testResult 가 false 이면 false 를
반환합니다.
k 를 k + 1로 설정합니다.
true 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.9 %TypedArray%.prototype.fill ( value [ ,
start [ , end ] ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.7 에 정의된
Array.prototype.fill과 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
O .[[ContentType]] 이
bigint 이면, value 를 ? ToBigInt (value )로 설정합니다.
그 밖의 경우, value 를 ? ToNumber (value )로 설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 startIndex 를 0으로 설정합니다.
그 밖의 경우 relativeStart < 0이면 startIndex 를 max (len
+ relativeStart , 0)으로 설정합니다.
그 밖의 경우 startIndex 를 min (relativeStart ,
len )로 설정합니다.
end 가 undefined 이면 relativeEnd 를
len 으로 설정하고, 아니면 relativeEnd 를 ? ToIntegerOrInfinity (end )로
설정합니다.
relativeEnd = -∞이면 endIndex 를 0으로 설정합니다.
그 밖의 경우 relativeEnd < 0이면 endIndex 를 max (len
+ relativeEnd , 0)으로 설정합니다.
그 밖의 경우 endIndex 를 min (relativeEnd , len )로
설정합니다.
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 TypeError 예외를 throw합니다.
len 을 TypedArrayLength (taRecord )로
설정합니다.
endIndex 를 min (endIndex , len )로
설정합니다.
k 를 startIndex 로 설정합니다.
k < endIndex 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
! Set (O ,
Pk , value , true )를 수행합니다.
k 를 k + 1로 설정합니다.
O 를 반환합니다.
23.2.3.10 %TypedArray%.prototype.filter ( callback [
, thisArg ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.8 에 정의된
Array.prototype.filter과 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
IsCallable (callback )가
false 이면 TypeError 예외를 throw합니다.
kept 를 새로운 빈 List 로 설정합니다.
captured 를 0으로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ! Get (O , Pk )로
설정합니다.
selected 를 ToBoolean (? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »))로 설정합니다.
selected 가 true 이면,
kValue 를 kept 에 추가합니다.
captured 를 captured + 1로 설정합니다.
k 를 k + 1로 설정합니다.
A 를 ? TypedArraySpeciesCreate (O , «
𝔽 (captured ) »)로 설정합니다.
n 을 0으로 설정합니다.
kept 의 각 요소 e 에 대해 다음을 수행합니다,
! Set (A ,
! ToString (𝔽 (n )),
e , true )를 수행합니다.
n 을 n + 1로 설정합니다.
A 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.11 %TypedArray%.prototype.find ( predicate [ ,
thisArg ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.9 에 정의된
Array.prototype.find와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
findRec 를 ? FindViaPredicate (O ,
len , ascending , predicate ,
thisArg )로 설정합니다.
findRec .[[Value]] 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.12 %TypedArray%.prototype.findIndex (
predicate [ , thisArg ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.10 에 정의된
Array.prototype.findIndex와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
findRec 를 ? FindViaPredicate (O ,
len , ascending , predicate ,
thisArg )로 설정합니다.
findRec .[[Index]] 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.13 %TypedArray%.prototype.findLast ( predicate
[ , thisArg ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.11 에 정의된
Array.prototype.findLast와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
findRec 를 ? FindViaPredicate (O ,
len , descending , predicate ,
thisArg )로 설정합니다.
findRec .[[Value]] 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.14 %TypedArray%.prototype.findLastIndex (
predicate [ , thisArg ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.12 에 정의된
Array.prototype.findLastIndex와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
findRec 를 ? FindViaPredicate (O ,
len , descending , predicate ,
thisArg )로 설정합니다.
findRec .[[Index]] 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.15 %TypedArray%.prototype.forEach ( callback [
, thisArg ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.15 에 정의된
Array.prototype.forEach와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
IsCallable (callback )가
false 이면 TypeError 예외를 throw합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ! Get (O , Pk )로
설정합니다.
? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »)를 수행합니다.
k 를 k + 1로 설정합니다.
undefined 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.16 %TypedArray%.prototype.includes (
searchElement [ , fromIndex ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.16 에 정의된
Array.prototype.includes와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
len = 0이면 false 를 반환합니다.
n 를 ? ToIntegerOrInfinity (fromIndex )로
설정합니다.
Assert :
fromIndex 가 undefined 이면 n 은 0입니다.
n = +∞이면 false 를 반환합니다.
그 밖의 경우 n = -∞이면 n 를 0으로 설정합니다.
n ≥ 0이면,
k 를 n 으로 설정합니다.
그 밖의 경우,
k 를 len + n 으로 설정합니다.
k < 0이면 k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
elementK 를 ! Get (O ,
! ToString (𝔽 (k )))로 설정합니다.
SameValueZero (searchElement ,
elementK )가 true 이면 true 를
반환합니다.
k 를 k + 1로 설정합니다.
false 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.17 %TypedArray%.prototype.indexOf (
searchElement [ , fromIndex ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.17 에 정의된
Array.prototype.indexOf와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
len = 0이면 -1 𝔽 를 반환합니다.
n 를 ? ToIntegerOrInfinity (fromIndex )로
설정합니다.
Assert :
fromIndex 가 undefined 이면 n 은 0입니다.
n = +∞이면 -1 𝔽 를 반환합니다.
그 밖의 경우 n = -∞이면 n 를 0으로 설정합니다.
n ≥ 0이면,
k 를 n 으로 설정합니다.
그 밖의 경우,
k 를 len + n 으로 설정합니다.
k < 0이면 k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ! HasProperty (O ,
Pk )로 설정합니다.
kPresent 가 true 이면,
elementK 를 ! Get (O ,
Pk )로 설정합니다.
IsStrictlyEqual (searchElement ,
elementK )가 true 이면 𝔽 (k )를
반환합니다.
k 를 k + 1로 설정합니다.
-1 𝔽 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.18 %TypedArray%.prototype.join ( separator )
이 메서드의 인수 해석 및 사용법은 23.1.3.18 에 정의된
Array.prototype.join과 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
separator 가 undefined 이면 sep 를
"," 로 설정합니다.
그 밖의 경우, sep 를 ? ToString (separator )로 설정합니다.
R 을 빈 문자열로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
k > 0이면 R 을 R 과 sep 를 문자열 연결 한 값으로 설정합니다.
element 를 ! Get (O ,
! ToString (𝔽 (k )))로 설정합니다.
element 가 undefined 가 아니면,
S 를 ! ToString (element )로
설정합니다.
R 을 R 과 S 를 문자열 연결 한 값으로
설정합니다.
k 를 k + 1로 설정합니다.
R 을 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.19 %TypedArray%.prototype.keys ( )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? ValidateTypedArray (O ,
seq-cst )를 수행합니다.
CreateArrayIterator (O ,
key )를 반환합니다.
23.2.3.20 %TypedArray%.prototype.lastIndexOf (
searchElement [ , fromIndex ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.20 에 정의된
Array.prototype.lastIndexOf와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
len = 0이면 -1 𝔽 를 반환합니다.
fromIndex 가 제공되면 n 를 ? ToIntegerOrInfinity (fromIndex )로
설정하고, 아니라면 n 을 len - 1로 설정합니다.
n = -∞이면 -1 𝔽 를 반환합니다.
n ≥ 0이면,
k 를 min (n , len -
1)로 설정합니다.
그 밖의 경우,
k 를 len + n 으로 설정합니다.
k ≥ 0인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ! HasProperty (O ,
Pk )로 설정합니다.
kPresent 가 true 이면,
elementK 를 ! Get (O ,
Pk )로 설정합니다.
IsStrictlyEqual (searchElement ,
elementK )가 true 이면 𝔽 (k )를
반환합니다.
k 를 k - 1로 설정합니다.
-1 𝔽 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.21 get %TypedArray%.prototype.length
%TypedArray% .prototype.length
는 접근자
프로퍼티 이며, set 접근자 함수는 undefined 입니다.
get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[TypedArrayName]] )를 수행합니다.
Assert :
O 는 [[ViewedArrayBuffer]] 와 [[ArrayLength]] 내부 슬롯을 가집니다.
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 +0 𝔽 를 반환합니다.
length 를 TypedArrayLength (taRecord )로
설정합니다.
𝔽 (length )를 반환합니다.
이 함수는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.22 %TypedArray%.prototype.map ( callback [ ,
thisArg ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.21 에 정의된
Array.prototype.map과 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
IsCallable (callback )가
false 이면 TypeError 예외를 throw합니다.
A 를 ? TypedArraySpeciesCreate (O , «
𝔽 (len ) »)로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ! Get (O , Pk )로
설정합니다.
mappedValue 를 ? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »)로 설정합니다.
? Set (A , Pk ,
mappedValue , true )를 수행합니다.
k 를 k + 1로 설정합니다.
A 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.23 %TypedArray%.prototype.reduce ( callback [
, initialValue ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.24 에 정의된
Array.prototype.reduce와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
IsCallable (callback )가
false 이면 TypeError 예외를 throw합니다.
len = 0이고 initialValue 가 제공되지 않으면 TypeError
예외를 throw합니다.
k 를 0으로 설정합니다.
accumulator 를 undefined 로 설정합니다.
initialValue 가 제공되면,
accumulator 를 initialValue 로 설정합니다.
그 밖의 경우,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
accumulator 를 ! Get (O , Pk )로
설정합니다.
k 를 k + 1로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ! Get (O , Pk )로
설정합니다.
accumulator 를 ? Call (callback ,
undefined , « accumulator , kValue ,
𝔽 (k ), O »)로
설정합니다.
k 를 k + 1로 설정합니다.
accumulator 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.24 %TypedArray%.prototype.reduceRight (
callback [ , initialValue ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.25 에 정의된
Array.prototype.reduceRight와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
IsCallable (callback )가
false 이면 TypeError 예외를 throw합니다.
len = 0이고 initialValue 가 제공되지 않으면 TypeError
예외를 throw합니다.
k 를 len - 1로 설정합니다.
accumulator 를 undefined 로 설정합니다.
initialValue 가 제공되면,
accumulator 를 initialValue 로 설정합니다.
그 밖의 경우,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
accumulator 를 ! Get (O , Pk )로
설정합니다.
k 를 k - 1로 설정합니다.
k ≥ 0인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ! Get (O , Pk )로
설정합니다.
accumulator 를 ? Call (callback ,
undefined , « accumulator , kValue ,
𝔽 (k ), O »)로
설정합니다.
k 를 k - 1로 설정합니다.
accumulator 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.25 %TypedArray%.prototype.reverse ( )
이 메서드의 인수 해석 및 사용법은 23.1.3.26 에 정의된
Array.prototype.reverse와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
middle 를 floor (len / 2)로 설정합니다.
lower 를 0으로 설정합니다.
lower ≠ middle 인 동안 반복합니다,
upper 를 len - lower - 1로 설정합니다.
upperP 를 ! ToString (𝔽 (upper ))로
설정합니다.
lowerP 를 ! ToString (𝔽 (lower ))로
설정합니다.
lowerValue 를 ! Get (O ,
lowerP )로 설정합니다.
upperValue 를 ! Get (O ,
upperP )로 설정합니다.
! Set (O ,
lowerP , upperValue , true )를 수행합니다.
! Set (O ,
upperP , lowerValue , true )를 수행합니다.
lower 를 lower + 1로 설정합니다.
O 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.26 %TypedArray%.prototype.set ( source [ ,
offset ] )
이 메서드는 이 TypedArray 의 여러 값을 source 에서 값을 읽어 설정합니다. 상세 동작은
source 의 타입에 따라 다릅니다. 선택적 offset 값은 이 TypedArray 에 값을 쓸 첫 번째
요소 인덱스를 의미합니다. 생략된 경우 0으로 간주됩니다.
호출 시 다음 단계들을 수행합니다:
target 를 this 값으로 설정합니다.
? RequireInternalSlot (target ,
[[TypedArrayName]] )를 수행합니다.
Assert :
target 는 [[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
targetOffset 를 ? ToIntegerOrInfinity (offset )로
설정합니다.
targetOffset < 0이면 RangeError 예외를 throw합니다.
source 가 객체 이고 [[TypedArrayName]] 내부 슬롯을 가지면,
? SetTypedArrayFromTypedArray (target ,
targetOffset , source )를 수행합니다.
그 밖의 경우,
? SetTypedArrayFromArrayLike (target ,
targetOffset , source )를 수행합니다.
undefined 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.26.1 SetTypedArrayFromArrayLike ( target ,
targetOffset , source )
추상 연산 SetTypedArrayFromArrayLike는 인수 target (a
TypedArray ), targetOffset (0 이상의
정수 또는 +∞),
source (ECMAScript 언어 값 , 단
TypedArray 는 아님)를 받고 내용이
unused 인 일반 완료(normal completion) 또는 throw 완료 를 반환합니다.
target 의 targetOffset 인덱스부터 source 에서 값을 읽어 여러 값을 설정합니다.
호출 시 다음 단계들을 수행합니다:
targetRecord 를 MakeTypedArrayWithBufferWitnessRecord (target ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (targetRecord )
가 true 이면 TypeError 예외를 throw합니다.
targetLength 를 TypedArrayLength (targetRecord )로
설정합니다.
src 를 ? ToObject (source )로 설정합니다.
srcLength 를 ? LengthOfArrayLike (src )로
설정합니다.
targetOffset = +∞이면 RangeError 예외를 throw합니다.
srcLength + targetOffset > targetLength 이면,
RangeError 예외를 throw합니다.
k 를 0으로 설정합니다.
k < srcLength 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로
설정합니다.
value 를 ? Get (src ,
Pk )로 설정합니다.
targetIndex 를 𝔽 (targetOffset +
k )로 설정합니다.
? TypedArraySetElement (target ,
targetIndex , value )를 수행합니다.
k 를 k + 1로 설정합니다.
unused 를 반환합니다.
23.2.3.26.2 SetTypedArrayFromTypedArray ( target ,
targetOffset , source )
추상 연산 SetTypedArrayFromTypedArray는 인수 target (TypedArray ),
targetOffset (0 이상의 정수 또는 +∞), source (TypedArray )를
받고 내용이
unused 인 일반 완료(normal completion) 또는 throw 완료 를 반환합니다.
target 의 targetOffset 인덱스부터 source 에서 값을 읽어 여러 값을 설정합니다.
호출 시 다음 단계들을 수행합니다:
targetBuffer 를 target .[[ViewedArrayBuffer]] 로 설정합니다.
targetRecord 를 MakeTypedArrayWithBufferWitnessRecord (target ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (targetRecord )
가 true 이면 TypeError 예외를 throw합니다.
targetLength 를 TypedArrayLength (targetRecord )로
설정합니다.
srcBuffer 를 source .[[ViewedArrayBuffer]] 로 설정합니다.
srcRecord 를 MakeTypedArrayWithBufferWitnessRecord (source ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (srcRecord )
가 true 이면 TypeError 예외를 throw합니다.
srcLength 를 TypedArrayLength (srcRecord )로
설정합니다.
targetType 를 TypedArrayElementType (target )로
설정합니다.
targetElementSize 를 TypedArrayElementSize (target )로
설정합니다.
targetByteOffset 을 target .[[ByteOffset]] 로 설정합니다.
srcType 을 TypedArrayElementType (source )로
설정합니다.
srcElementSize 를 TypedArrayElementSize (source )로
설정합니다.
srcByteOffset 을 source .[[ByteOffset]] 로 설정합니다.
targetOffset = +∞이면 RangeError 예외를 throw합니다.
srcLength + targetOffset > targetLength 이면,
RangeError 예외를 throw합니다.
target .[[ContentType]] 이
source .[[ContentType]] 과 다르면
TypeError 예외를 throw합니다.
IsSharedArrayBuffer (srcBuffer )
가 true , IsSharedArrayBuffer (targetBuffer )
가 true 이고 srcBuffer .[[ArrayBufferData]] 가 targetBuffer .[[ArrayBufferData]] 와 같으면
sameSharedArrayBuffer 를 true 로, 그렇지 않으면
sameSharedArrayBuffer 를 false 로 설정합니다.
SameValue (srcBuffer ,
targetBuffer )가 true 이거나
sameSharedArrayBuffer 가 true 이면,
srcByteLength 를 TypedArrayByteLength (srcRecord )로
설정합니다.
srcBuffer 를 ? CloneArrayBuffer (srcBuffer ,
srcByteOffset , srcByteLength )로 설정합니다.
srcByteIndex 를 0으로 설정합니다.
그 밖의 경우,
srcByteIndex 를 srcByteOffset 으로 설정합니다.
targetByteIndex 를 (targetOffset ×
targetElementSize ) + targetByteOffset 로 설정합니다.
limit 을 targetByteIndex +
(targetElementSize × srcLength )로 설정합니다.
srcType 이 targetType 이면,
참고: 전달은 소스 데이터의 비트 단위 인코딩을 보존하는 방식으로 수행되어야 합니다.
targetByteIndex < limit 인 동안 반복합니다,
value 를 GetValueFromBuffer (srcBuffer ,
srcByteIndex , uint8 ,
true , unordered )로
설정합니다.
SetValueInBuffer (targetBuffer ,
targetByteIndex , uint8 ,
value , true ,
unordered )를 수행합니다.
srcByteIndex 를 srcByteIndex + 1로 설정합니다.
targetByteIndex 를 targetByteIndex +
1로 설정합니다.
그 밖의 경우,
targetByteIndex < limit 인 동안 반복합니다,
value 를 GetValueFromBuffer (srcBuffer ,
srcByteIndex , srcType ,
true , unordered )로
설정합니다.
SetValueInBuffer (targetBuffer ,
targetByteIndex , targetType ,
value , true ,
unordered )를 수행합니다.
srcByteIndex 를 srcByteIndex +
srcElementSize 로 설정합니다.
targetByteIndex 를 targetByteIndex +
targetElementSize 로 설정합니다.
unused 를 반환합니다.
23.2.3.27 %TypedArray%.prototype.slice ( start ,
end )
이 메서드의 인수 해석 및 사용법은 23.1.3.28 에 정의된
Array.prototype.slice와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
srcArrayLength 를 TypedArrayLength (taRecord )로
설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 startIndex 를 0으로 설정합니다.
그 밖의 경우 relativeStart < 0이면 startIndex 를 max (srcArrayLength +
relativeStart , 0)으로 설정합니다.
그 밖의 경우 startIndex 를 min (relativeStart ,
srcArrayLength )로 설정합니다.
end 가 undefined 이면 relativeEnd 를
srcArrayLength 로 설정하고, 아니면 relativeEnd 를 ? ToIntegerOrInfinity (end )로
설정합니다.
relativeEnd = -∞이면 endIndex 를 0으로 설정합니다.
그 밖의 경우 relativeEnd < 0이면 endIndex 를 max (srcArrayLength
+
relativeEnd , 0)으로 설정합니다.
그 밖의 경우 endIndex 를 min (relativeEnd ,
srcArrayLength )로 설정합니다.
countBytes 를 max (endIndex -
startIndex , 0)로 설정합니다.
A 를 ? TypedArraySpeciesCreate (O , «
𝔽 (countBytes ) »)로 설정합니다.
countBytes > 0이면,
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 TypeError 예외를 throw합니다.
endIndex 를 min (endIndex , TypedArrayLength (taRecord ))로
설정합니다.
countBytes 를 max (endIndex -
startIndex , 0)로 설정합니다.
srcType 을 TypedArrayElementType (O )로
설정합니다.
targetType 을 TypedArrayElementType (A )로
설정합니다.
srcType 이 targetType 이면,
참고: 전달은 소스 데이터의 비트 단위 인코딩을 보존하는 방식으로 수행되어야 합니다.
srcBuffer 를 O .[[ViewedArrayBuffer]] 로 설정합니다.
targetBuffer 를 A .[[ViewedArrayBuffer]] 로 설정합니다.
elementSize 를 TypedArrayElementSize (O )로
설정합니다.
srcByteOffset 을 O .[[ByteOffset]] 로 설정합니다.
srcByteIndex 를 (startIndex ×
elementSize ) + srcByteOffset 로 설정합니다.
targetByteIndex 를 A .[[ByteOffset]] 로 설정합니다.
endByteIndex 를 targetByteIndex +
(countBytes × elementSize )로 설정합니다.
targetByteIndex <
endByteIndex 인 동안 반복합니다,
value 를 GetValueFromBuffer (srcBuffer ,
srcByteIndex , uint8 ,
true , unordered )로
설정합니다.
SetValueInBuffer (targetBuffer ,
targetByteIndex , uint8 ,
value , true ,
unordered )를 수행합니다.
srcByteIndex 를 srcByteIndex + 1로 설정합니다.
targetByteIndex 를 targetByteIndex
+ 1로 설정합니다.
그 밖의 경우,
n 을 0으로 설정합니다.
k 를 startIndex 로 설정합니다.
k < endIndex 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ! Get (O ,
Pk )로 설정합니다.
! Set (A ,
! ToString (𝔽 (n )),
kValue , true )를 수행합니다.
k 를 k + 1로 설정합니다.
n 을 n + 1로 설정합니다.
A 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.28 %TypedArray%.prototype.some ( callback [ ,
thisArg ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.29 에 정의된
Array.prototype.some과 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
IsCallable (callback )가
false 이면 TypeError 예외를 throw합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ! Get (O , Pk )로
설정합니다.
testResult 를 ToBoolean (? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »))로 설정합니다.
testResult 가 true 이면 true 를
반환합니다.
k 를 k + 1로 설정합니다.
false 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.29 %TypedArray%.prototype.sort ( comparator )
이것은 별도의 메서드로, 아래에 설명한 부분을 제외하면 23.1.3.30 에 정의된
Array.prototype.sort의 요구 사항을 구현합니다. 이 메서드의 구현은 this 값이 고정
길이이며 정수
인덱스(integer-indexed) 프로퍼티가 희소하지 않다는 사실을 활용해 최적화할 수 있습니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
호출 시 다음 단계들을 수행합니다:
comparator 가 undefined 가 아니고 IsCallable (comparator )가
false 이면 TypeError 예외를 throw합니다.
obj 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (obj ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
참고: 다음 클로저는 23.1.3.30 에서 사용되는 문자열 비교 대신
숫자 비교를 수행합니다.
SortCompare 를 매개변수 (x , y )와 comparator 를
캡처하여 호출 시 다음 단계들을 수행하는 새로운 추상 클로저(Abstract Closure) 로 설정합니다:
? CompareTypedArrayElements (x ,
y , comparator )를 반환합니다.
sortedList 를 ? SortIndexedProperties (obj ,
len , SortCompare , read-through-holes )로
설정합니다.
j 를 0으로 설정합니다.
j < len 인 동안 반복합니다,
! Set (obj ,
! ToString (𝔽 (j )),
sortedList [j ], true )를 수행합니다.
j 를 j + 1로 설정합니다.
obj 를 반환합니다.
참고
NaN 은 항상 다른 어떤 값보다 더 크게 비교되므로 (자세한 내용은 CompareTypedArrayElements
참조), comparator 가 제공되지 않은 경우 NaN 프로퍼티 값은 항상 결과의 끝에
정렬됩니다.
23.2.3.30 %TypedArray%.prototype.subarray ( start ,
end )
이 메서드는 새로운 TypedArray 를 반환합니다. 반환되는 TypedArray 의 요소 타입은 이
TypedArray 의 요소 타입과 같고, ArrayBuffer는 이 TypedArray 의 ArrayBuffer입니다. 반환되는
객체는 start (포함)부터 end (제외)까지의 interval 에 해당하는 요소를 참조합니다.
start 또는 end 가 음수인 경우, 배열의 끝에서부터 인덱스를 참조합니다.
호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[TypedArrayName]] )를 수행합니다.
Assert :
O 는 [[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
buffer 를 O .[[ViewedArrayBuffer]] 로
설정합니다.
srcRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (srcRecord )
가 true 이면,
srcLength 를 0으로 설정합니다.
그 밖의 경우,
srcLength 를 TypedArrayLength (srcRecord )로
설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 startIndex 를 0으로 설정합니다.
그 밖의 경우 relativeStart < 0이면 startIndex 를 max (srcLength +
relativeStart , 0)으로 설정합니다.
그 밖의 경우 startIndex 를 min (relativeStart ,
srcLength )로 설정합니다.
elementSize 를 TypedArrayElementSize (O )로
설정합니다.
srcByteOffset 을 O .[[ByteOffset]] 로
설정합니다.
beginByteOffset 을 srcByteOffset + (startIndex
× elementSize )로 설정합니다.
O .[[ArrayLength]] 가 auto 이고
end 가 undefined 이면,
argumentsList 를 « buffer , 𝔽 (beginByteOffset ) »로
설정합니다.
그 밖의 경우,
end 가 undefined 이면 relativeEnd 를
srcLength 로 설정하고, 아니라면 relativeEnd 를 ? ToIntegerOrInfinity (end )로
설정합니다.
relativeEnd = -∞이면 endIndex 를 0으로 설정합니다.
그 밖의 경우 relativeEnd < 0이면 endIndex 를 max (srcLength +
relativeEnd , 0)으로 설정합니다.
그 밖의 경우 endIndex 를 min (relativeEnd ,
srcLength )로 설정합니다.
newLength 를 max (endIndex -
startIndex , 0)로 설정합니다.
argumentsList 를 « buffer , 𝔽 (beginByteOffset ), 𝔽 (newLength ) »로 설정합니다.
? TypedArraySpeciesCreate (O ,
argumentsList )를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.31 %TypedArray%.prototype.toLocaleString ( [
reserved1 [ , reserved2 ] ] )
이 메서드는 23.1.3.32 에 정의된
Array.prototype.toLocaleString과 동일한 알고리즘을 구현하는 별도의 메서드입니다. 단, TypedArrayLength 를 사용하여
"length" 의 [[Get]] 을 대신합니다. 알고리즘 구현은 버퍼가 리사이즈 불가능할
때 this 값의 길이가 고정되어 있다는 점과 integer-indexed 프로퍼티가 희소하지 않다는
점을 활용해 최적화할 수 있습니다. 단, 이러한 최적화는 알고리즘의 명세된 행동에 관찰 가능한 변화를 주면 안 됩니다.
이 메서드는 일반적이지 않습니다. ValidateTypedArray 가
this 값과 seq-cst 인수로 호출되어 알고리즘 평가 전 예외가 발생하면, 알고리즘
평가 대신 해당 예외가 throw됩니다.
참고
ECMAScript 구현에 ECMA-402 국제화 API가 포함되어 있다면, 이 메서드는 ECMA-402 명세의
Array.prototype.toLocaleString 알고리즘을 기반으로 합니다.
23.2.3.32 %TypedArray%.prototype.toReversed ( )
이 메서드는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
length 를 TypedArrayLength (taRecord )로
설정합니다.
A 를 ? TypedArrayCreateSameType (O , «
𝔽 (length ) »)로 설정합니다.
k 를 0으로 설정합니다.
k < length 인 동안 반복합니다,
from 을 ! ToString (𝔽 (length -
k - 1))로 설정합니다.
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
fromValue 를 ! Get (O ,
from )로 설정합니다.
! Set (A ,
Pk , fromValue , true )를 수행합니다.
k 를 k + 1로 설정합니다.
A 를 반환합니다.
23.2.3.33 %TypedArray%.prototype.toSorted (
comparator )
이 메서드는 호출 시 다음 단계들을 수행합니다:
comparator 가 undefined 가 아니고 IsCallable (comparator )가
false 이면 TypeError 예외를 throw합니다.
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
A 를 ? TypedArrayCreateSameType (O , «
𝔽 (len ) »)로 설정합니다.
참고: 다음 클로저는 23.1.3.34 에서 사용되는 문자열 비교
대신 숫자 비교를 수행합니다.
SortCompare 를 매개변수 (x , y )와 comparator 를
캡처하여 호출 시 다음 단계들을 수행하는 새로운 추상 클로저(Abstract Closure) 로 설정합니다:
? CompareTypedArrayElements (x ,
y , comparator )를 반환합니다.
sortedList 를 ? SortIndexedProperties (O ,
len , SortCompare , read-through-holes )로
설정합니다.
j 를 0으로 설정합니다.
j < len 인 동안 반복합니다,
! Set (A ,
! ToString (𝔽 (j )),
sortedList [j ], true )를 수행합니다.
j 를 j + 1로 설정합니다.
A 를 반환합니다.
23.2.3.34 %TypedArray%.prototype.toString ( )
"toString" 프로퍼티의 초기 값은 23.1.3.36 에 정의된
%Array.prototype.toString%입니다.
23.2.3.35 %TypedArray%.prototype.values ( )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? ValidateTypedArray (O ,
seq-cst )를 수행합니다.
CreateArrayIterator (O ,
value )를 반환합니다.
23.2.3.36 %TypedArray%.prototype.with ( index ,
value )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
relativeIndex 를 ? ToIntegerOrInfinity (index )로
설정합니다.
relativeIndex ≥ 0이면 actualIndex 를 relativeIndex 로
설정합니다.
그 밖의 경우 actualIndex 를 len + relativeIndex 로 설정합니다.
O .[[ContentType]] 이
bigint 이면 numericValue 를 ? ToBigInt (value )로 설정합니다.
그 밖의 경우 numericValue 를 ? ToNumber (value )로 설정합니다.
IsValidIntegerIndex (O ,
𝔽 (actualIndex ))가
false 이면 RangeError 예외를 throw합니다.
A 를 ? TypedArrayCreateSameType (O , «
𝔽 (len ) »)로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
k = actualIndex 이면 fromValue 를
numericValue 로 설정합니다.
그 밖의 경우 fromValue 를 ! Get (O ,
Pk )로 설정합니다.
! Set (A ,
Pk , fromValue , true )를 수행합니다.
k 를 k + 1로 설정합니다.
A 를 반환합니다.
23.2.3.37 %TypedArray%.prototype [ %Symbol.iterator% ] ( )
%Symbol.iterator% 프로퍼티의 초기 값은
23.2.3.35 에 정의된
%TypedArray.prototype.values%입니다.
23.2.3.38 get %TypedArray%.prototype [ %Symbol.toStringTag% ]
%TypedArray% .prototype[%Symbol.toStringTag%]
는 접근자
프로퍼티 이며, set 접근자 함수는 undefined 입니다.
get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
O 가 객체가 아니면 undefined 를
반환합니다.
O 에 [[TypedArrayName]] 내부 슬롯이 없으면
undefined 를 반환합니다.
name 을 O .[[TypedArrayName]] 로 설정합니다.
Assert :
name 은 문자열 입니다.
name 을 반환합니다.
이 프로퍼티의 속성은 { [[Enumerable]] :
false , [[Configurable]] : true
}입니다.
이 함수의 "name" 프로퍼티의 초기 값은 "get
[Symbol.toStringTag]" 입니다.
23.2.4 TypedArray 객체에 대한 추상 연산
23.2.4.1 TypedArrayCreateFromConstructor (
constructor , argumentList )
추상 연산 TypedArrayCreateFromConstructor는 인수 constructor (생성자 )와
argumentList (리스트 형태의
ECMAScript 언어 값 )를 받고, 정상 완료(normal
completion) 로 TypedArray 또는 throw 완료 를 반환합니다. 이는
생성자 함수를
사용해 새로운 TypedArray 를 생성하는 명세에 사용됩니다. 호출 시 다음 단계들을 수행합니다:
newTypedArray 를 ? Construct (constructor ,
argumentList )로 설정합니다.
taRecord 를 ? ValidateTypedArray (newTypedArray ,
seq-cst )로 설정합니다.
Assert :
newTypedArray 는 TypedArray 인스턴스의
프로퍼티 에 명시된 모든 내부 슬롯을 갖습니다.
argumentList 의 요소 개수가 1이고 argumentList [0]이 Number 이면,
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 TypeError 예외를 throw합니다.
length 를 TypedArrayLength (taRecord )로
설정합니다.
length < ℝ (argumentList [0])이면
TypeError 예외를 throw합니다.
newTypedArray 를 반환합니다.
23.2.4.2 TypedArrayCreateSameType ( exemplar ,
argumentList )
추상 연산 TypedArrayCreateSameType은 인수 exemplar (TypedArray )와
argumentList (리스트 형태의
ECMAScript 언어 값 )를 받고, 정상 완료(normal
completion) 로 TypedArray 또는 throw 완료 를 반환합니다. 이는
exemplar 에서 파생된 생성자 함수를 사용해 새로운 TypedArray 를 생성하는 명세에 사용됩니다.
TypedArraySpeciesCreate 와 달리,
%Symbol.species% 를 통해 커스텀 TypedArray
서브클래스를 생성할 수 있는 것과 다르게, 이 연산은 항상 내장 TypedArray 생성자 중 하나를 사용합니다. 호출 시 다음 단계들을
수행합니다:
constructor 를 생성자 이름 exemplar .[[TypedArrayName]] 에 연관된 내재 객체로 표 75 에서 찾습니다.
result 를 ? TypedArrayCreateFromConstructor (constructor ,
argumentList )로 설정합니다.
Assert :
result .[[ContentType]] 은 exemplar .[[ContentType]] 와 같습니다.
result 를 반환합니다.
23.2.4.3 TypedArraySpeciesCreate ( exemplar ,
argumentList )
추상 연산 TypedArraySpeciesCreate는 인수 exemplar (TypedArray )와
argumentList (리스트 형태의
ECMAScript 언어 값 )를 받고, 정상 완료(normal
completion) 로 TypedArray 또는 throw 완료 를 반환합니다. 이는
exemplar 에서 파생된 생성자 함수를 사용해 새로운 TypedArray 를 생성하는 명세에 사용됩니다.
ArraySpeciesCreate 와 달리, %Symbol.species% 를 통해 Array가 아닌 객체를 생성할
수 있지만, 이 연산은 생성자 함수가 실제 TypedArray 를 생성하도록 강제합니다. 호출 시 다음
단계들을 수행합니다:
defaultConstructor 를 생성자 이름 exemplar .[[TypedArrayName]] 에 연관된 내재 객체로 표 75 에서 찾습니다.
constructor 를 ? SpeciesConstructor (exemplar ,
defaultConstructor )로 설정합니다.
result 를 ? TypedArrayCreateFromConstructor (constructor ,
argumentList )로 설정합니다.
result .[[ContentType]] 이 exemplar .[[ContentType]] 와 다르면 TypeError 예외를
throw합니다.
result 를 반환합니다.
23.2.4.4 ValidateTypedArray ( O , order )
추상 연산 ValidateTypedArray는 인수 O (ECMAScript 언어
값 )와 order (seq-cst 또는
unordered )를 받고, 정상 완료(normal
completion) 로 TypedArray With Buffer Witness
Record 또는 throw
완료 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
? RequireInternalSlot (O ,
[[TypedArrayName]] )를 수행합니다.
Assert :
O 는 [[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
order )로 설정합니다.
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 TypeError 예외를 throw합니다.
taRecord 를 반환합니다.
23.2.4.5 TypedArrayElementSize ( O )
추상 연산 TypedArrayElementSize는 인수 O (TypedArray )를 받고, 0 이상의 정수 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
O .[[TypedArrayName]] 에 대해 표 75 에 지정된 요소
크기(Element Size) 값을 반환합니다.
23.2.4.6 TypedArrayElementType ( O )
추상 연산 TypedArrayElementType은 인수 O (TypedArray )를 받고, TypedArray 요소 타입 를 반환합니다. 호출 시 다음 단계들을
수행합니다:
O .[[TypedArrayName]] 에 대해 표 75 에 지정된 요소
타입(Element Type) 값을 반환합니다.
23.2.4.7 CompareTypedArrayElements ( x , y ,
comparator )
추상 연산 CompareTypedArrayElements는 인수 x (Number 또는 BigInt), y (Number 또는
BigInt), comparator (함수 객체 또는 undefined )를 받고,
정상 완료(normal
completion) 로 Number 또는 abrupt completion 를
반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
x 가 Number 이고
y 가 Number 이거나,
x 가 BigInt 이고
y 가 BigInt 입니다.
comparator 가 undefined 가 아니면,
v 를 ? ToNumber (?
Call (comparator ,
undefined , « x , y »))로 설정합니다.
v 가 NaN 이면 +0 𝔽 를
반환합니다.
v 를 반환합니다.
x 와 y 가 모두 NaN 이면
+0 𝔽 를 반환합니다.
x 가 NaN 이면 1 𝔽 를 반환합니다.
y 가 NaN 이면 -1 𝔽 를 반환합니다.
x < y 이면 -1 𝔽 를 반환합니다.
x > y 이면 1 𝔽 를 반환합니다.
x 가 -0 𝔽 이고 y 가
+0 𝔽 이면 -1 𝔽 를 반환합니다.
x 가 +0 𝔽 이고 y 가
-0 𝔽 이면 1 𝔽 를 반환합니다.
+0 𝔽 를 반환합니다.
참고
이 연산은
23.1.3.30.2 에서 사용되는 문자열 비교 대신 숫자
비교를 수행합니다.
23.2.5 TypedArray 생성자
각 TypedArray 생성자 :
내재 객체이며, 아래에 설명된 구조를 가지나 표 75 에서
생성자 이름
대신 TypedArray 이름만 다릅니다.
인수의 개수와 타입에 따라 동작이 달라지는 함수입니다. TypedArray 를 호출할 때 실제 동작은 전달되는 인수의 개수와 종류에 따라
달라집니다.
함수로 호출되는 것은 의도된 사용이 아니며, 그렇게 호출하면 예외가 발생합니다.
클래스 정의의 extends 절 값으로 사용될 수 있습니다. 지정된 TypedArray 동작을 상속하려는 서브클래스
생성자 는
TypedArray 생성자 에 super 호출을 포함하여 서브클래스 인스턴스가
%TypedArray% .prototype
내장 메서드를 지원하는 데 필요한 내부 상태를 생성 및 초기화해야 합니다.
23.2.5.1 TypedArray ( ...args )
각 TypedArray 생성자 는 호출될 때 다음 단계들을 수행합니다:
NewTarget이 undefined 이면 TypeError 예외를 throw합니다.
constructorName 을 표 75 에서
이 TypedArray 생성자 에 대해 명시된 생성자 이름의 문자열 값으로 설정합니다.
proto 를 "%TypedArray .prototype%"로 설정합니다.
numberOfArgs 를 args 의 요소 개수로 설정합니다.
numberOfArgs = 0이면,
? AllocateTypedArray (constructorName ,
NewTarget, proto , 0)를 반환합니다.
그 밖의 경우,
firstArgument 를 args [0]으로 설정합니다.
firstArgument 가 객체 이면,
O 를 ? AllocateTypedArray (constructorName ,
NewTarget, proto )로 설정합니다.
firstArgument 가 [[TypedArrayName]] 내부 슬롯을 가지면,
? InitializeTypedArrayFromTypedArray (O ,
firstArgument )를 수행합니다.
그 밖의 경우 firstArgument 가 [[ArrayBufferData]] 내부 슬롯을 가지면,
numberOfArgs > 1이면 byteOffset 를
args [1]으로, 아니면 byteOffset 를
undefined 로 설정합니다.
numberOfArgs > 2이면 length 를
args [2]으로, 아니면 length 를
undefined 로 설정합니다.
? InitializeTypedArrayFromArrayBuffer (O ,
firstArgument , byteOffset ,
length )를 수행합니다.
그 밖의 경우,
Assert :
firstArgument 는 객체 이며 [[TypedArrayName]] 또는 [[ArrayBufferData]] 내부 슬롯을 갖지 않습니다.
usingIterator 를 ? GetMethod (firstArgument ,
%Symbol.iterator% )로
설정합니다.
usingIterator 가 undefined 가 아니면,
values 를 ? IteratorToList (?
GetIteratorFromMethod (firstArgument ,
usingIterator ))로 설정합니다.
? InitializeTypedArrayFromList (O ,
values )를 수행합니다.
그 밖의 경우,
참고: firstArgument 는 이터러블
객체 가 아니므로, 이미 array-like
객체 라고 간주합니다.
? InitializeTypedArrayFromArrayLike (O ,
firstArgument )를 수행합니다.
O 를 반환합니다.
그 밖의 경우,
Assert :
firstArgument 는 객체가
아님 입니다.
elementLength 를 ? ToIndex (firstArgument )로
설정합니다.
? AllocateTypedArray (constructorName ,
NewTarget, proto , elementLength )를 반환합니다.
23.2.5.1.1 AllocateTypedArray ( constructorName ,
newTarget , defaultProto [ , length ] )
추상 연산 AllocateTypedArray는 인수 constructorName (TypedArray 생성자 이름의
문자열, 표 75 참조),
newTarget (생성자 ), defaultProto (문자열) 및 선택적
length (0 이상의 정수 )를 받고,
정상 완료(normal
completion) 로 TypedArray 또는 throw 완료 를 반환합니다.
length 인수가 전달되면 해당 길이의 ArrayBuffer도 할당되고 새 TypedArray 인스턴스에 연결됩니다.
AllocateTypedArray는 TypedArray 의 공통적인 의미를 제공합니다. 호출 시 다음 단계들을 수행합니다:
proto 를 ? GetPrototypeFromConstructor (newTarget ,
defaultProto )로 설정합니다.
obj 를 TypedArrayCreate (proto )로
설정합니다.
Assert : obj .[[ViewedArrayBuffer]] 는 undefined 입니다.
obj .[[TypedArrayName]] 을
constructorName 으로 설정합니다.
constructorName 이 "BigInt64Array" 또는
"BigUint64Array" 이면, obj .[[ContentType]] 을 bigint 로 설정합니다.
그 밖의 경우, obj .[[ContentType]] 을
number 로 설정합니다.
length 가 없으면,
obj .[[ByteLength]] 를 0으로 설정합니다.
obj .[[ByteOffset]] 를 0으로 설정합니다.
obj .[[ArrayLength]] 를 0으로 설정합니다.
그 밖의 경우,
? AllocateTypedArrayBuffer (obj ,
length )를 수행합니다.
obj 를 반환합니다.
23.2.5.1.2 InitializeTypedArrayFromTypedArray (
O , srcArray )
추상 연산 InitializeTypedArrayFromTypedArray는 인수 O (TypedArray ),
srcArray (TypedArray )를 받고, 정상 완료(normal
completion) 로 unused 또는 throw 완료 를 반환합니다.
호출 시 다음 단계들을 수행합니다:
srcData 를 srcArray .[[ViewedArrayBuffer]] 로 설정합니다.
elementType 을 TypedArrayElementType (O )로
설정합니다.
elementSize 를 TypedArrayElementSize (O )로
설정합니다.
srcType 을 TypedArrayElementType (srcArray )로
설정합니다.
srcElementSize 를 TypedArrayElementSize (srcArray )로
설정합니다.
srcByteOffset 을 srcArray .[[ByteOffset]] 로 설정합니다.
srcRecord 를 MakeTypedArrayWithBufferWitnessRecord (srcArray ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (srcRecord )
가 true 이면 TypeError 예외를 throw합니다.
elementLength 를 TypedArrayLength (srcRecord )로
설정합니다.
byteLength 를 elementSize × elementLength 로 설정합니다.
elementType 이 srcType 이면,
data 를 ? CloneArrayBuffer (srcData ,
srcByteOffset , byteLength )로 설정합니다.
그 밖의 경우,
data 를 ? AllocateArrayBuffer (%ArrayBuffer% ,
byteLength )로 설정합니다.
srcArray .[[ContentType]] 이
O .[[ContentType]] 과 다르면
TypeError 예외를 throw합니다.
srcByteIndex 를 srcByteOffset 으로 설정합니다.
targetByteIndex 를 0으로 설정합니다.
count 를 elementLength 로 설정합니다.
count > 0인 동안 반복합니다,
value 를 GetValueFromBuffer (srcData ,
srcByteIndex , srcType ,
true , unordered )로
설정합니다.
SetValueInBuffer (data ,
targetByteIndex , elementType ,
value , true ,
unordered )를 수행합니다.
srcByteIndex 를 srcByteIndex +
srcElementSize 로 설정합니다.
targetByteIndex 를 targetByteIndex +
elementSize 로 설정합니다.
count 를 count - 1로 설정합니다.
O .[[ViewedArrayBuffer]] 를
data 로 설정합니다.
O .[[ByteLength]] 를
byteLength 로 설정합니다.
O .[[ByteOffset]] 를 0으로 설정합니다.
O .[[ArrayLength]] 를
elementLength 로 설정합니다.
unused 를 반환합니다.
23.2.5.1.3 InitializeTypedArrayFromArrayBuffer (
O , buffer , byteOffset , length )
추상 연산 InitializeTypedArrayFromArrayBuffer는 인수 O (TypedArray ), buffer
(ArrayBuffer 또는 SharedArrayBuffer), byteOffset (ECMAScript 언어 값 ),
length (ECMAScript 언어 값 )를 받고,
정상 완료(normal
completion) 로 unused 또는 throw 완료 를 반환합니다.
호출 시 다음 단계들을 수행합니다:
elementSize 를 TypedArrayElementSize (O )로
설정합니다.
offset 을 ? ToIndex (byteOffset )로
설정합니다.
offset modulo elementSize ≠ 0이면
RangeError 예외를 throw합니다.
bufferIsFixedLength 를 IsFixedLengthArrayBuffer (buffer )로
설정합니다.
length 가 undefined 가 아니면,
newLength 를 ? ToIndex (length )로
설정합니다.
IsDetachedBuffer (buffer )
가 true 이면 TypeError 예외를 throw합니다.
bufferByteLength 를 ArrayBufferByteLength (buffer ,
seq-cst )로 설정합니다.
length 가 undefined 이고
bufferIsFixedLength 가 false 이면,
offset > bufferByteLength 이면
RangeError 예외를 throw합니다.
O .[[ByteLength]] 를
auto 로 설정합니다.
O .[[ArrayLength]] 를
auto 로 설정합니다.
그 밖의 경우,
length 가 undefined 이면,
bufferByteLength modulo
elementSize ≠ 0이면 RangeError 예외를
throw합니다.
newByteLength 를 bufferByteLength -
offset 으로 설정합니다.
newByteLength < 0이면 RangeError
예외를 throw합니다.
그 밖의 경우,
newByteLength 를 newLength ×
elementSize 로 설정합니다.
offset + newByteLength >
bufferByteLength 이면 RangeError 예외를
throw합니다.
O .[[ByteLength]] 를
newByteLength 로 설정합니다.
O .[[ArrayLength]] 를
newByteLength / elementSize 로 설정합니다.
O .[[ViewedArrayBuffer]] 를
buffer 로 설정합니다.
O .[[ByteOffset]] 를 offset 으로 설정합니다.
unused 를 반환합니다.
23.2.5.1.4 InitializeTypedArrayFromList ( O ,
values )
추상 연산 InitializeTypedArrayFromList는 인수 O (TypedArray ), values
(리스트 형태의 ECMAScript 언어 값 )를 받고,
정상 완료(normal
completion) 로 unused 또는 throw 완료 를 반환합니다.
호출 시 다음 단계들을 수행합니다:
len 을 values 의 요소 개수로 설정합니다.
? AllocateTypedArrayBuffer (O ,
len )를 수행합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로
설정합니다.
kValue 를 values 의 첫 번째 요소로 설정합니다.
values 의 첫 번째 요소를 제거합니다.
? Set (O ,
Pk , kValue , true )를 수행합니다.
k 를 k + 1로 설정합니다.
Assert : values 는 이제 빈 리스트 입니다.
unused 를 반환합니다.
23.2.5.1.5 InitializeTypedArrayFromArrayLike ( O ,
arrayLike )
추상 연산 InitializeTypedArrayFromArrayLike는 인수 O (TypedArray ),
arrayLike (객체, 단 TypedArray 또는 ArrayBuffer는 아님)를 받고, 정상 완료(normal
completion) 로 unused 또는 throw 완료 를 반환합니다.
호출 시 다음 단계들을 수행합니다:
len 을 ? LengthOfArrayLike (arrayLike )로
설정합니다.
? AllocateTypedArrayBuffer (O ,
len )를 수행합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로
설정합니다.
kValue 를 ? Get (arrayLike ,
Pk )로 설정합니다.
? Set (O ,
Pk , kValue , true )를 수행합니다.
k 를 k + 1로 설정합니다.
unused 를 반환합니다.
23.2.5.1.6 AllocateTypedArrayBuffer ( O ,
length )
추상 연산 AllocateTypedArrayBuffer는 인수 O (TypedArray ), length
(0 이상의 정수 )를
받고, 정상 완료(normal
completion) 로 unused 또는 throw 완료 를 반환합니다.
O 에 ArrayBuffer를 할당하고 연결합니다. 호출 시 다음 단계들을 수행합니다:
Assert : O .[[ViewedArrayBuffer]] 는 undefined 입니다.
elementSize 를 TypedArrayElementSize (O )로
설정합니다.
byteLength 를 elementSize × length 로 설정합니다.
data 를 ? AllocateArrayBuffer (%ArrayBuffer% ,
byteLength )로 설정합니다.
O .[[ViewedArrayBuffer]] 를
data 로 설정합니다.
O .[[ByteLength]] 를
byteLength 로 설정합니다.
O .[[ByteOffset]] 를 0으로 설정합니다.
O .[[ArrayLength]] 를 length 로 설정합니다.
unused 를 반환합니다.
23.2.6 TypedArray 생성자의 프로퍼티
각 TypedArray 생성자 :
[[Prototype]] 내부 슬롯을 가지며 그 값은 %TypedArray% 입니다.
"length" 프로퍼티를 가지며 그 값은 3 𝔽 입니다.
"name" 프로퍼티를 가지며 그 값은 표 75 에서 명시된
생성자 이름의
문자열 값입니다.
다음 프로퍼티들을 가집니다:
23.2.6.1 TypedArray .BYTES_PER_ELEMENT
TypedArray .BYTES_PER_ELEMENT의 값은 표 75 에서
TypedArray 에 대해 명시된 요소 크기(Element Size) 값입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
23.2.6.2 TypedArray .prototype
TypedArray .prototype의 초기 값은 해당 TypedArray 프로토타입 내재
객체(23.2.7 )입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
23.2.7 TypedArray 프로토타입 객체의 프로퍼티
각 TypedArray 프로토타입 객체:
[[Prototype]] 내부 슬롯을 가지며 그 값은 %TypedArray.prototype% 입니다.
일반
객체 입니다.
[[ViewedArrayBuffer]] 또는 TypedArray 인스턴스 객체에 특화된 기타 내부
슬롯을 가지지 않습니다.
23.2.7.1 TypedArray .prototype.BYTES_PER_ELEMENT
TypedArray .prototype.BYTES_PER_ELEMENT의 값은 표 75 에서
TypedArray 에 대해 명시된 요소 크기(Element Size) 값입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
23.2.7.2 TypedArray .prototype.constructor
프로토타입의 "constructor" 프로퍼티의 초기 값은 해당 TypedArray 생성자 자체입니다.
23.2.8 TypedArray 인스턴스의 프로퍼티
TypedArray 인스턴스는 TypedArrays 입니다. 각 TypedArray 인스턴스는 해당
TypedArray 프로토타입 객체로부터 프로퍼티를 상속받습니다. 각 TypedArray 인스턴스는 다음 내부 슬롯을 가집니다:
[[ViewedArrayBuffer]] , [[TypedArrayName]] ,
[[ContentType]] , [[ByteLength]] , [[ByteOffset]] , [[ArrayLength]] .
24 Keyed Collections
24.1 Map Objects
Maps are collections of key/value pairs where both the keys and values may be arbitrary ECMAScript language values . A distinct
key value may only occur in one key/value pair within the Map's collection. Distinct key values are
discriminated using the semantics of the SameValueZero comparison algorithm.
Maps must be implemented using either hash tables or other mechanisms that, on average, provide
access times that are sublinear on the number of elements in the collection. The data structure used
in this specification is only intended to describe the required observable semantics of Maps. It is
not intended to be a viable implementation model.
24.1.1 The Map Constructor
The Map constructor :
is %Map% .
is the initial value of the "Map" property of the global
object .
creates and initializes a new Map when called as a constructor .
is not intended to be called as a function and will throw an exception when called in that
manner.
may be used as the value in an extends clause of a class definition. Subclass
constructors that intend to inherit the specified
Map behaviour must include a super call to the Map constructor to
create and initialize the subclass instance with the internal state necessary to support the
Map.prototype built-in methods.
24.1.1.1 Map ( [ iterable ] )
This function performs the following steps when called:
If NewTarget is undefined , throw a TypeError
exception.
Let map be ? OrdinaryCreateFromConstructor (NewTarget,
"%Map.prototype%" , « [[MapData]] »).
Set map .[[MapData]] to a new empty List .
If iterable is either undefined or
null , return map .
Let adder be ? Get (map ,
"set" ).
If IsCallable (adder ) is
false , throw a TypeError exception.
Return ? AddEntriesFromIterable (map ,
iterable , adder ).
Note
If the parameter iterable is present, it is expected to be an object that
implements a %Symbol.iterator% method that
returns an iterator object that produces
a two element array-like object whose first
element is a value that will be used as a Map key and whose second element is the
value to associate with that key.
24.1.1.2 AddEntriesFromIterable ( target ,
iterable , adder )
The abstract operation AddEntriesFromIterable takes arguments target (an Object),
iterable (an ECMAScript language value , but
not undefined or null ), and adder (a
function
object ) and returns either a normal completion
containing an ECMAScript language
value or a throw
completion . adder will be invoked, with target
as the receiver. It performs the following steps when called:
Let iteratorRecord be ? GetIterator (iterable ,
sync ).
Repeat,
Let next be ? IteratorStepValue (iteratorRecord ).
If next is done , return target .
If next is not an Object , then
Let error be ThrowCompletion (a
newly created TypeError object).
Return ? IteratorClose (iteratorRecord ,
error ).
Let k be Completion (Get (next ,
"0" )).
IfAbruptCloseIterator (k ,
iteratorRecord ).
Let v be Completion (Get (next ,
"1" )).
IfAbruptCloseIterator (v ,
iteratorRecord ).
Let status be Completion (Call (adder ,
target , « k , v »)).
IfAbruptCloseIterator (status ,
iteratorRecord ).
Note
The parameter iterable is expected to be an object that implements a
%Symbol.iterator% method that
returns an iterator object that produces
a two element array-like object whose first
element is a value that will be used as a Map key and whose second element is the
value to associate with that key.
24.1.2 Properties of the Map Constructor
The Map constructor :
has a [[Prototype]] internal slot whose value is %Function.prototype% .
has the following properties:
24.1.2.1 Map.groupBy ( items , callback )
Note
callback should be a function that accepts two arguments.
groupBy calls callback once for each element in
items , in ascending order, and constructs a new Map. Each value returned
by callback is used as a key in the Map. For each such key, the result
Map has an entry whose key is that key and whose value is an array containing all
the elements for which callback returned that key.
callback is called with two arguments: the value of the element and the
index of the element.
The return value of groupBy is a Map.
This function performs the following steps when called:
Let groups be ? GroupBy (items ,
callback , collection ).
Let map be ! Construct (%Map% ).
For each Record { [[Key]] , [[Elements]] }
g of groups , do
Let elements be CreateArrayFromList (g .[[Elements]] ).
Let entry be the Record
{ [[Key]] : g .[[Key]] , [[Value]] :
elements }.
Append entry to map .[[MapData]] .
Return map .
24.1.2.2 Map.prototype
The initial value of Map.prototype is the Map prototype
object .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }.
24.1.2.3 get Map [ %Symbol.species% ]
Map[%Symbol.species%] is an accessor property whose set accessor function
is undefined . Its get accessor function performs the following steps when
called:
Return the this value.
The value of the "name" property of this function is "get
[Symbol.species]" .
Note
Methods that create derived collection objects should call %Symbol.species% to determine
the constructor to use to create the derived
objects. Subclass constructor may over-ride %Symbol.species% to change the
default constructor assignment.
24.1.3 Properties of the Map Prototype Object
The Map prototype object :
24.1.3.1 Map.prototype.clear ( )
This method performs the following steps when called:
Let M be the this value.
Perform ? RequireInternalSlot (M ,
[[MapData]] ).
For each Record { [[Key]] , [[Value]] }
p of M .[[MapData]] , do
Set p .[[Key]] to
empty .
Set p .[[Value]] to
empty .
Return undefined .
Note
The existing [[MapData]] List is
preserved because there may be existing Map Iterator
objects that are suspended midway through iterating over that
List .
24.1.3.2 Map.prototype.constructor
The initial value of Map.prototype.constructor is %Map% .
24.1.3.3 Map.prototype.delete ( key )
This method performs the following steps when called:
Let M be the this value.
Perform ? RequireInternalSlot (M ,
[[MapData]] ).
Set key to CanonicalizeKeyedCollectionKey (key ).
For each Record { [[Key]] , [[Value]] }
p of M .[[MapData]] , do
If p .[[Key]] is not
empty and SameValue (p .[[Key]] , key ) is true ,
then
Set p .[[Key]] to
empty .
Set p .[[Value]] to
empty .
Return true .
Return false .
Note
The value empty is used as a specification device to indicate
that an entry has been deleted. Actual implementations may take other actions such
as physically removing the entry from internal data structures.
24.1.3.4 Map.prototype.entries ( )
This method performs the following steps when called:
Let M be the this value.
Return ? CreateMapIterator (M ,
key+value ).
24.1.3.5 Map.prototype.forEach ( callback [ ,
thisArg ] )
This method performs the following steps when called:
Let M be the this value.
Perform ? RequireInternalSlot (M ,
[[MapData]] ).
If IsCallable (callback ) is
false , throw a TypeError exception.
Let entries be M .[[MapData]] .
Let numEntries be the number of elements in entries .
Let index be 0.
Repeat, while index < numEntries ,
Let e be entries [index ].
Set index to index + 1.
If e .[[Key]] is not
empty , then
Perform ? Call (callback ,
thisArg , « e .[[Value]] , e .[[Key]] , M »).
NOTE: The number of elements in entries may have
increased during execution of callback .
Set numEntries to the number of elements in
entries .
Return undefined .
Note
callback should be a function that accepts three arguments.
forEach calls callback once for each key/value pair present
in the Map, in key insertion order. callback is called only for keys of
the Map which actually exist; it is not called for keys that have been deleted from
the Map.
If a thisArg parameter is provided, it will be used as the
this value for each invocation of callback . If it is
not provided, undefined is used instead.
callback is called with three arguments: the value of the item, the key of
the item, and the Map being traversed.
forEach does not directly mutate the object on which it is called but
the object may be mutated by the calls to callback . Each entry of a map's
[[MapData]] is only visited once. New keys added after the
call to forEach begins are visited. A key will be revisited if it is
deleted after it has been visited and then re-added before the forEach
call completes. Keys that are deleted after the call to forEach begins
and before being visited are not visited unless the key is added again before the
forEach call completes.
24.1.3.6 Map.prototype.get ( key )
This method performs the following steps when called:
Let M be the this value.
Perform ? RequireInternalSlot (M ,
[[MapData]] ).
Set key to CanonicalizeKeyedCollectionKey (key ).
For each Record { [[Key]] , [[Value]] }
p of M .[[MapData]] , do
If p .[[Key]] is not
empty and SameValue (p .[[Key]] , key ) is true ,
return p .[[Value]] .
Return undefined .
24.1.3.7 Map.prototype.has ( key )
This method performs the following steps when called:
Let M be the this value.
Perform ? RequireInternalSlot (M ,
[[MapData]] ).
Set key to CanonicalizeKeyedCollectionKey (key ).
For each Record { [[Key]] , [[Value]] }
p of M .[[MapData]] , do
If p .[[Key]] is not
empty and SameValue (p .[[Key]] , key ) is true ,
return true .
Return false .
24.1.3.8 Map.prototype.keys ( )
This method performs the following steps when called:
Let M be the this value.
Return ? CreateMapIterator (M ,
key ).
24.1.3.9 Map.prototype.set ( key , value )
This method performs the following steps when called:
Let M be the this value.
Perform ? RequireInternalSlot (M ,
[[MapData]] ).
Set key to CanonicalizeKeyedCollectionKey (key ).
For each Record { [[Key]] , [[Value]] }
p of M .[[MapData]] , do
If p .[[Key]] is not
empty and SameValue (p .[[Key]] , key ) is true ,
then
Set p .[[Value]] to
value .
Return M .
Let p be the Record { [[Key]] : key , [[Value]] :
value }.
Append p to M .[[MapData]] .
Return M .
24.1.3.10 get Map.prototype.size
Map.prototype.size is an accessor property whose set accessor function
is undefined . Its get accessor function performs the following steps when
called:
Let M be the this value.
Perform ? RequireInternalSlot (M ,
[[MapData]] ).
Let count be 0.
For each Record { [[Key]] , [[Value]] }
p of M .[[MapData]] , do
If p .[[Key]] is not
empty , set count to count + 1.
Return 𝔽 (count ).
24.1.3.11 Map.prototype.values ( )
This method performs the following steps when called:
Let M be the this value.
Return ? CreateMapIterator (M ,
value ).
24.1.3.12 Map.prototype [ %Symbol.iterator% ] ( )
The initial value of the %Symbol.iterator% property is
%Map.prototype.entries%, defined in 24.1.3.4 .
24.1.3.13 Map.prototype [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is the
String value "Map" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
24.1.4 Properties of Map Instances
Map instances are ordinary objects that inherit properties from the
Map prototype object .
Map instances also have a [[MapData]] internal slot.
24.1.5 Map Iterator Objects
A Map
Iterator is an object that represents a specific iteration over some specific Map
instance object. There is not a named constructor for Map Iterator objects. Instead, Map
Iterator objects are created by calling certain methods of Map instance objects.
24.1.5.1 CreateMapIterator ( map , kind )
The abstract operation CreateMapIterator takes arguments map (an ECMAScript language value ) and
kind (key+value , key , or
value ) and returns either a normal completion
containing a Generator or a throw completion . It
is used to create iterator objects for Map methods that
return such iterators . It performs the following
steps when called:
Perform ? RequireInternalSlot (map ,
[[MapData]] ).
Let closure be a new Abstract Closure
with no parameters that captures map and kind and performs the
following steps when called:
Let entries be map .[[MapData]] .
Let index be 0.
Let numEntries be the number of elements in entries .
Repeat, while index < numEntries ,
Let e be entries [index ].
Set index to index + 1.
If e .[[Key]] is not
empty , then
If kind is key , then
Let result be e .[[Key]] .
Else if kind is value ,
then
Let result be e .[[Value]] .
Else,
Assert :
kind is key+value .
Let result be CreateArrayFromList («
e .[[Key]] ,
e .[[Value]] »).
Perform ? GeneratorYield (CreateIteratorResultObject (result ,
false )).
NOTE: The number of elements in entries may have
increased while execution of this abstract operation was
paused by GeneratorYield .
Set numEntries to the number of elements in
entries .
Return NormalCompletion (unused ).
Return CreateIteratorFromClosure (closure ,
"%MapIteratorPrototype%" , %MapIteratorPrototype% ).
24.1.5.2 The %MapIteratorPrototype% Object
The %MapIteratorPrototype% object:
24.1.5.2.1 %MapIteratorPrototype%.next ( )
Return ? GeneratorResume (this
value, empty ,
"%MapIteratorPrototype%" ).
24.1.5.2.2 %MapIteratorPrototype% [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is
the String value "Map Iterator" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] :
false , [[Configurable]] :
true }.
24.2 Set Objects
Set objects are collections of ECMAScript language values . A distinct
value may only occur once as an element of a Set's collection. Distinct values are discriminated
using the semantics of the SameValueZero comparison algorithm.
Set objects must be implemented using either hash tables or other mechanisms that, on average,
provide access times that are sublinear on the number of elements in the collection. The data
structure used in this specification is only intended to describe the required observable semantics
of Set objects. It is not intended to be a viable implementation model.
24.2.1 Abstract Operations For Set Objects
24.2.1.1 Set Records
A Set Record is a Record value used to
encapsulate the interface of a Set or similar object.
Set Records have the fields listed in Table 76 .
Table 76: Set Record Fields
Field Name
Value
Meaning
[[SetObject]]
an Object
the Set or similar object.
[[Size]]
a non-negative integer or +∞
The reported size of the object.
[[Has]]
a function object
The has method of the object.
[[Keys]]
a function object
The keys method of the object.
24.2.1.2 GetSetRecord ( obj )
The abstract operation GetSetRecord takes argument obj (an ECMAScript language value ) and
returns either a normal completion
containing a Set Record or a throw completion . It
performs the following steps when called:
If obj is not an Object , throw a
TypeError exception.
Let rawSize be ? Get (obj ,
"size" ).
Let numSize be ? ToNumber (rawSize ).
NOTE: If rawSize is undefined , then numSize
will be NaN .
If numSize is NaN , throw a
TypeError exception.
Let intSize be ! ToIntegerOrInfinity (numSize ).
If intSize < 0, throw a RangeError exception.
Let has be ? Get (obj ,
"has" ).
If IsCallable (has ) is
false , throw a TypeError exception.
Let keys be ? Get (obj ,
"keys" ).
If IsCallable (keys ) is
false , throw a TypeError exception.
Return a new Set Record { [[SetObject]] : obj , [[Size]] : intSize , [[Has]] : has , [[Keys]] :
keys }.
24.2.1.3 SetDataHas ( setData , value )
The abstract operation SetDataHas takes arguments setData (a List of either
ECMAScript language values or
empty ) and value (an ECMAScript language value ) and
returns a Boolean. It performs the following steps when called:
If SetDataIndex (setData ,
value ) is not-found , return
false .
Return true .
24.2.1.4 SetDataIndex ( setData , value )
The abstract operation SetDataIndex takes arguments setData (a List of either
ECMAScript language values or
empty ) and value (an ECMAScript language value ) and
returns a non-negative integer or not-found . It
performs the following steps when called:
Set value to CanonicalizeKeyedCollectionKey (value ).
Let size be the number of elements in setData .
Let index be 0.
Repeat, while index < size ,
Let e be setData [index ].
If e is not empty and e is
value , then
Return index .
Set index to index + 1.
Return not-found .
24.2.1.5 SetDataSize ( setData )
The abstract operation SetDataSize takes argument setData (a List of either
ECMAScript language values or
empty ) and returns a non-negative integer . It performs the following
steps when called:
Let count be 0.
For each element e of setData , do
If e is not empty , set count to
count + 1.
Return count .
24.2.2 The Set Constructor
The Set constructor :
is %Set% .
is the initial value of the "Set" property of the global
object .
creates and initializes a new Set object when called as a constructor .
is not intended to be called as a function and will throw an exception when called in that
manner.
may be used as the value in an extends clause of a class definition. Subclass
constructors that intend to inherit the specified
Set behaviour must include a super call to the Set constructor to
create and initialize the subclass instance with the internal state necessary to support the
Set.prototype built-in methods.
24.2.2.1 Set ( [ iterable ] )
This function performs the following steps when called:
If NewTarget is undefined , throw a TypeError
exception.
Let set be ? OrdinaryCreateFromConstructor (NewTarget,
"%Set.prototype%" , « [[SetData]] »).
Set set .[[SetData]] to a new empty List .
If iterable is either undefined or
null , return set .
Let adder be ? Get (set ,
"add" ).
If IsCallable (adder ) is
false , throw a TypeError exception.
Let iteratorRecord be ? GetIterator (iterable ,
sync ).
Repeat,
Let next be ? IteratorStepValue (iteratorRecord ).
If next is done , return set .
Let status be Completion (Call (adder ,
set , « next »)).
IfAbruptCloseIterator (status ,
iteratorRecord ).
24.2.3 Properties of the Set Constructor
The Set constructor :
has a [[Prototype]] internal slot whose value is %Function.prototype% .
has the following properties:
24.2.3.1 Set.prototype
The initial value of Set.prototype is the Set prototype
object .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }.
24.2.3.2 get Set [ %Symbol.species% ]
Set[%Symbol.species%] is an accessor property whose set accessor function
is undefined . Its get accessor function performs the following steps when
called:
Return the this value.
The value of the "name" property of this function is "get
[Symbol.species]" .
Note
Methods that create derived collection objects should call %Symbol.species% to determine
the constructor to use to create the derived
objects. Subclass constructor may over-ride %Symbol.species% to change the
default constructor assignment.
24.2.4 Properties of the Set Prototype Object
The Set prototype object :
24.2.4.1 Set.prototype.add ( value )
This method performs the following steps when called:
Let S be the this value.
Perform ? RequireInternalSlot (S ,
[[SetData]] ).
Set value to CanonicalizeKeyedCollectionKey (value ).
For each element e of S .[[SetData]] ,
do
If e is not empty and SameValue (e ,
value ) is true , then
Return S .
Append value to S .[[SetData]] .
Return S .
24.2.4.2 Set.prototype.clear ( )
This method performs the following steps when called:
Let S be the this value.
Perform ? RequireInternalSlot (S ,
[[SetData]] ).
For each element e of S .[[SetData]] ,
do
Replace the element of S .[[SetData]]
whose value is e with an element whose value is
empty .
Return undefined .
Note
The existing [[SetData]] List is
preserved because there may be existing Set Iterator
objects that are suspended midway through iterating over that
List .
24.2.4.3 Set.prototype.constructor
The initial value of Set.prototype.constructor is %Set% .
24.2.4.4 Set.prototype.delete ( value )
This method performs the following steps when called:
Let S be the this value.
Perform ? RequireInternalSlot (S ,
[[SetData]] ).
Set value to CanonicalizeKeyedCollectionKey (value ).
For each element e of S .[[SetData]] ,
do
If e is not empty and SameValue (e ,
value ) is true , then
Replace the element of S .[[SetData]] whose value is e with
an element whose value is empty .
Return true .
Return false .
Note
The value empty is used as a specification device to indicate
that an entry has been deleted. Actual implementations may take other actions such
as physically removing the entry from internal data structures.
24.2.4.5 Set.prototype.difference ( other )
This method performs the following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[SetData]] ).
Let otherRec be ? GetSetRecord (other ).
Let resultSetData be a copy of O .[[SetData]] .
If SetDataSize (O .[[SetData]] ) ≤ otherRec .[[Size]] , then
Let thisSize be the number of elements in O .[[SetData]] .
Let index be 0.
Repeat, while index < thisSize ,
Let e be resultSetData [index ].
If e is not empty , then
Let inOther be ToBoolean (?
Call (otherRec .[[Has]] , otherRec .[[SetObject]] , «
e »)).
If inOther is true , then
Set resultSetData [index ] to
empty .
Set index to index + 1.
Else,
Let keysIter be ? GetIteratorFromMethod (otherRec .[[SetObject]] , otherRec .[[Keys]] ).
Let next be not-started .
Repeat, while next is not done ,
Set next to ? IteratorStepValue (keysIter ).
If next is not done , then
Set next to CanonicalizeKeyedCollectionKey (next ).
Let valueIndex be SetDataIndex (resultSetData ,
next ).
If valueIndex is not
not-found , then
Set resultSetData [valueIndex ]
to empty .
Let result be OrdinaryObjectCreate (%Set.prototype% ,
« [[SetData]] »).
Set result .[[SetData]] to
resultSetData .
Return result .
24.2.4.6 Set.prototype.entries ( )
This method performs the following steps when called:
Let S be the this value.
Return ? CreateSetIterator (S ,
key+value ).
Note
For iteration purposes, a Set appears similar to a Map where each entry has the same
value for its key and value.
24.2.4.7 Set.prototype.forEach ( callback [ ,
thisArg ] )
This method performs the following steps when called:
Let S be the this value.
Perform ? RequireInternalSlot (S ,
[[SetData]] ).
If IsCallable (callback ) is
false , throw a TypeError exception.
Let entries be S .[[SetData]] .
Let numEntries be the number of elements in entries .
Let index be 0.
Repeat, while index < numEntries ,
Let e be entries [index ].
Set index to index + 1.
If e is not empty , then
Perform ? Call (callback ,
thisArg , « e , e ,
S »).
NOTE: The number of elements in entries may have
increased during execution of callback .
Set numEntries to the number of elements in
entries .
Return undefined .
Note
callback should be a function that accepts three arguments.
forEach calls callback once for each value present in the
Set object, in value insertion order. callback is called only for values
of the Set which actually exist; it is not called for keys that have been deleted
from the set.
If a thisArg parameter is provided, it will be used as the
this value for each invocation of callback . If it is
not provided, undefined is used instead.
callback is called with three arguments: the first two arguments are a
value contained in the Set. The same value is passed for both arguments. The Set
object being traversed is passed as the third argument.
The callback is called with three arguments to be consistent with the call
back functions used by forEach methods for Map and Array. For Sets,
each item value is considered to be both the key and the value.
forEach does not directly mutate the object on which it is called but
the object may be mutated by the calls to callback .
Each value is normally visited only once. However, a value will be revisited if it is
deleted after it has been visited and then re-added before the forEach
call completes. Values that are deleted after the call to forEach
begins and before being visited are not visited unless the value is added again
before the forEach call completes. New values added after the call to
forEach begins are visited.
24.2.4.8 Set.prototype.has ( value )
This method performs the following steps when called:
Let S be the this value.
Perform ? RequireInternalSlot (S ,
[[SetData]] ).
Set value to CanonicalizeKeyedCollectionKey (value ).
For each element e of S .[[SetData]] ,
do
If e is not empty and SameValue (e ,
value ) is true , return
true .
Return false .
24.2.4.9 Set.prototype.intersection ( other )
This method performs the following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[SetData]] ).
Let otherRec be ? GetSetRecord (other ).
Let resultSetData be a new empty List .
If SetDataSize (O .[[SetData]] ) ≤ otherRec .[[Size]] , then
Let thisSize be the number of elements in O .[[SetData]] .
Let index be 0.
Repeat, while index < thisSize ,
Let e be O .[[SetData]] [index ].
Set index to index + 1.
If e is not empty , then
Let inOther be ToBoolean (?
Call (otherRec .[[Has]] , otherRec .[[SetObject]] , «
e »)).
If inOther is true , then
NOTE: It is possible for earlier calls to
otherRec .[[Has]]
to remove and re-add an element of O .[[SetData]] , which can cause
the same element to be visited twice during this
iteration.
If SetDataHas (resultSetData ,
e ) is false , then
Append e to
resultSetData .
NOTE: The number of elements in O .[[SetData]] may have increased
during execution of otherRec .[[Has]] .
Set thisSize to the number of elements in
O .[[SetData]] .
Else,
Let keysIter be ? GetIteratorFromMethod (otherRec .[[SetObject]] , otherRec .[[Keys]] ).
Let next be not-started .
Repeat, while next is not done ,
Set next to ? IteratorStepValue (keysIter ).
If next is not done , then
Set next to CanonicalizeKeyedCollectionKey (next ).
Let inThis be SetDataHas (O .[[SetData]] , next ).
If inThis is true , then
NOTE: Because other is an arbitrary
object, it is possible for its
"keys" iterator
to produce the same value more than once.
If SetDataHas (resultSetData ,
next ) is false , then
Append next to
resultSetData .
Let result be OrdinaryObjectCreate (%Set.prototype% ,
« [[SetData]] »).
Set result .[[SetData]] to
resultSetData .
Return result .
24.2.4.10 Set.prototype.isDisjointFrom ( other )
This method performs the following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[SetData]] ).
Let otherRec be ? GetSetRecord (other ).
If SetDataSize (O .[[SetData]] ) ≤ otherRec .[[Size]] , then
Let thisSize be the number of elements in O .[[SetData]] .
Let index be 0.
Repeat, while index < thisSize ,
Let e be O .[[SetData]] [index ].
Set index to index + 1.
If e is not empty , then
Let inOther be ToBoolean (?
Call (otherRec .[[Has]] , otherRec .[[SetObject]] , «
e »)).
If inOther is true , return
false .
NOTE: The number of elements in O .[[SetData]] may have increased
during execution of otherRec .[[Has]] .
Set thisSize to the number of elements in
O .[[SetData]] .
Else,
Let keysIter be ? GetIteratorFromMethod (otherRec .[[SetObject]] , otherRec .[[Keys]] ).
Let next be not-started .
Repeat, while next is not done ,
Set next to ? IteratorStepValue (keysIter ).
If next is not done , then
If SetDataHas (O .[[SetData]] , next ) is
true , then
Perform ? IteratorClose (keysIter ,
NormalCompletion (unused )).
Return false .
Return true .
24.2.4.11 Set.prototype.isSubsetOf ( other )
This method performs the following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[SetData]] ).
Let otherRec be ? GetSetRecord (other ).
If SetDataSize (O .[[SetData]] ) > otherRec .[[Size]] , return false .
Let thisSize be the number of elements in O .[[SetData]] .
Let index be 0.
Repeat, while index < thisSize ,
Let e be O .[[SetData]] [index ].
Set index to index + 1.
If e is not empty , then
Let inOther be ToBoolean (? Call (otherRec .[[Has]] , otherRec .[[SetObject]] , « e »)).
If inOther is false , return
false .
NOTE: The number of elements in O .[[SetData]] may have increased during
execution of otherRec .[[Has]] .
Set thisSize to the number of elements in
O .[[SetData]] .
Return true .
24.2.4.12 Set.prototype.isSupersetOf ( other )
This method performs the following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[SetData]] ).
Let otherRec be ? GetSetRecord (other ).
If SetDataSize (O .[[SetData]] ) < otherRec .[[Size]] , return false .
Let keysIter be ? GetIteratorFromMethod (otherRec .[[SetObject]] , otherRec .[[Keys]] ).
Let next be not-started .
Repeat, while next is not done ,
Set next to ? IteratorStepValue (keysIter ).
If next is not done , then
If SetDataHas (O .[[SetData]] , next ) is
false , then
Perform ? IteratorClose (keysIter ,
NormalCompletion (unused )).
Return false .
Return true .
24.2.4.13 Set.prototype.keys ( )
The initial value of the "keys" property is %Set.prototype.values%,
defined in 24.2.4.17 .
Note
For iteration purposes, a Set appears similar to a Map where each entry has the same
value for its key and value.
24.2.4.14 get Set.prototype.size
Set.prototype.size is an accessor property whose set accessor function
is undefined . Its get accessor function performs the following steps when
called:
Let S be the this value.
Perform ? RequireInternalSlot (S ,
[[SetData]] ).
Let size be SetDataSize (S .[[SetData]] ).
Return 𝔽 (size ).
24.2.4.15 Set.prototype.symmetricDifference ( other )
This method performs the following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[SetData]] ).
Let otherRec be ? GetSetRecord (other ).
Let keysIter be ? GetIteratorFromMethod (otherRec .[[SetObject]] , otherRec .[[Keys]] ).
Let resultSetData be a copy of O .[[SetData]] .
Let next be not-started .
Repeat, while next is not done ,
Set next to ? IteratorStepValue (keysIter ).
If next is not done , then
Set next to CanonicalizeKeyedCollectionKey (next ).
Let resultIndex be SetDataIndex (resultSetData ,
next ).
If resultIndex is not-found , let
alreadyInResult be false ; otherwise
let alreadyInResult be true .
If SetDataHas (O .[[SetData]] , next ) is
true , then
If alreadyInResult is true ,
set resultSetData [resultIndex ] to
empty .
Else,
If alreadyInResult is false ,
append next to resultSetData .
Let result be OrdinaryObjectCreate (%Set.prototype% ,
« [[SetData]] »).
Set result .[[SetData]] to
resultSetData .
Return result .
24.2.4.16 Set.prototype.union ( other )
This method performs the following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[SetData]] ).
Let otherRec be ? GetSetRecord (other ).
Let keysIter be ? GetIteratorFromMethod (otherRec .[[SetObject]] , otherRec .[[Keys]] ).
Let resultSetData be a copy of O .[[SetData]] .
Let next be not-started .
Repeat, while next is not done ,
Set next to ? IteratorStepValue (keysIter ).
If next is not done , then
Set next to CanonicalizeKeyedCollectionKey (next ).
If SetDataHas (resultSetData ,
next ) is false , then
Append next to resultSetData .
Let result be OrdinaryObjectCreate (%Set.prototype% ,
« [[SetData]] »).
Set result .[[SetData]] to
resultSetData .
Return result .
24.2.4.17 Set.prototype.values ( )
This method performs the following steps when called:
Let S be the this value.
Return ? CreateSetIterator (S ,
value ).
24.2.4.18 Set.prototype [ %Symbol.iterator% ] ( )
The initial value of the %Symbol.iterator% property is
%Set.prototype.values%, defined in 24.2.4.17 .
24.2.4.19 Set.prototype [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is the
String value "Set" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
24.2.5 Properties of Set Instances
Set instances are ordinary objects that inherit properties from the
Set prototype object .
Set instances also have a [[SetData]] internal slot.
24.2.6 Set Iterator Objects
A Set
Iterator is an ordinary object , with the structure defined
below, that represents a specific iteration over some specific Set instance object. There is not
a named constructor for Set Iterator objects. Instead, Set
Iterator objects are created by calling certain methods of Set instance objects.
24.2.6.1 CreateSetIterator ( set , kind )
The abstract operation CreateSetIterator takes arguments set (an ECMAScript language value ) and
kind (key+value or value ) and
returns either a normal completion
containing a Generator or a throw completion . It
is used to create iterator objects for Set methods that
return such iterators . It performs the following
steps when called:
Perform ? RequireInternalSlot (set ,
[[SetData]] ).
Let closure be a new Abstract Closure
with no parameters that captures set and kind and performs the
following steps when called:
Let index be 0.
Let entries be set .[[SetData]] .
Let numEntries be the number of elements in entries .
Repeat, while index < numEntries ,
Let e be entries [index ].
Set index to index + 1.
If e is not empty , then
If kind is key+value , then
Let result be CreateArrayFromList («
e , e »).
Perform ? GeneratorYield (CreateIteratorResultObject (result ,
false )).
Else,
Assert :
kind is value .
Perform ? GeneratorYield (CreateIteratorResultObject (e ,
false )).
NOTE: The number of elements in entries may have
increased while execution of this abstract operation was
paused by GeneratorYield .
Set numEntries to the number of elements in
entries .
Return NormalCompletion (unused ).
Return CreateIteratorFromClosure (closure ,
"%SetIteratorPrototype%" , %SetIteratorPrototype% ).
24.2.6.2 The %SetIteratorPrototype% Object
The %SetIteratorPrototype% object:
24.2.6.2.1 %SetIteratorPrototype%.next ( )
Return ? GeneratorResume (this
value, empty ,
"%SetIteratorPrototype%" ).
24.2.6.2.2 %SetIteratorPrototype% [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is
the String value "Set Iterator" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] :
false , [[Configurable]] :
true }.
24.3 WeakMap Objects
WeakMaps are collections of key/value pairs where the keys are objects and/or symbols and values may
be arbitrary ECMAScript language values . A WeakMap
may be queried to see if it contains a key/value pair with a specific key, but no mechanism is
provided for enumerating the values it holds as keys. In certain conditions, values which are not
live are
removed as WeakMap keys, as described in 9.9.3 .
An implementation may impose an arbitrarily determined latency between the time a key/value pair of a
WeakMap becomes inaccessible and the time when the key/value pair is removed from the WeakMap. If
this latency was observable to ECMAScript program, it would be a source of indeterminacy that could
impact program execution. For that reason, an ECMAScript implementation must not provide any means
to observe a key of a WeakMap that does not require the observer to present the observed key.
WeakMaps must be implemented using either hash tables or other mechanisms that, on average, provide
access times that are sublinear on the number of key/value pairs in the collection. The data
structure used in this specification is only intended to describe the required observable semantics
of WeakMaps. It is not intended to be a viable implementation model.
Note
WeakMap and WeakSet are intended to provide mechanisms for dynamically associating state with
an object or symbol in a manner that does not “leak” memory resources if, in the absence of
the WeakMap or WeakSet instance, the object or symbol otherwise became inaccessible and
subject to resource reclamation by the implementation's garbage collection mechanisms. This
characteristic can be achieved by using an inverted per-object/symbol mapping of WeakMap or
WeakSet instances to keys. Alternatively, each WeakMap or WeakSet instance may internally
store its key and value data, but this approach requires coordination between the WeakMap or
WeakSet implementation and the garbage collector. The following references describe
mechanism that may be useful to implementations of WeakMap and WeakSet:
Barry Hayes. 1997. Ephemerons: a new finalization mechanism. In Proceedings of the 12th
ACM SIGPLAN conference on Object-oriented programming, systems, languages, and
applications (OOPSLA '97) , A. Michael Berman (Ed.). ACM, New York, NY, USA, 176-183,
http://doi.acm.org/10.1145/263698.263733 .
Alexandra Barros, Roberto Ierusalimschy, Eliminating Cycles in Weak Tables. Journal of
Universal Computer Science - J.UCS, vol. 14, no. 21, pp. 3481-3497, 2008, http://www.jucs.org/jucs_14_21/eliminating_cycles_in_weak
24.3.1 The WeakMap Constructor
The WeakMap constructor :
is %WeakMap% .
is the initial value of the "WeakMap" property of the global
object .
creates and initializes a new WeakMap when called as a constructor .
is not intended to be called as a function and will throw an exception when called in that
manner.
may be used as the value in an extends clause of a class definition. Subclass
constructors that intend to inherit the specified
WeakMap behaviour must include a super call to the WeakMap constructor to
create and initialize the subclass instance with the internal state necessary to support the
WeakMap.prototype built-in methods.
24.3.1.1 WeakMap ( [ iterable ] )
This function performs the following steps when called:
If NewTarget is undefined , throw a TypeError
exception.
Let map be ? OrdinaryCreateFromConstructor (NewTarget,
"%WeakMap.prototype%" , « [[WeakMapData]] »).
Set map .[[WeakMapData]] to a new empty List .
If iterable is either undefined or
null , return map .
Let adder be ? Get (map ,
"set" ).
If IsCallable (adder ) is
false , throw a TypeError exception.
Return ? AddEntriesFromIterable (map ,
iterable , adder ).
Note
If the parameter iterable is present, it is expected to be an object that
implements a %Symbol.iterator% method that
returns an iterator object that produces
a two element array-like object whose first
element is a value that will be used as a WeakMap key and whose second element is
the value to associate with that key.
24.3.2 Properties of the WeakMap Constructor
The WeakMap constructor :
has a [[Prototype]] internal slot whose value is %Function.prototype% .
has the following properties:
24.3.2.1 WeakMap.prototype
The initial value of WeakMap.prototype is the WeakMap prototype
object .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }.
24.3.3 Properties of the WeakMap Prototype Object
The WeakMap prototype object :
24.3.3.1 WeakMap.prototype.constructor
The initial value of WeakMap.prototype.constructor is %WeakMap% .
24.3.3.2 WeakMap.prototype.delete ( key )
This method performs the following steps when called:
Let M be the this value.
Perform ? RequireInternalSlot (M ,
[[WeakMapData]] ).
If CanBeHeldWeakly (key )
is false , return false .
For each Record { [[Key]] , [[Value]] }
p of M .[[WeakMapData]] , do
If p .[[Key]] is not
empty and SameValue (p .[[Key]] , key ) is true ,
then
Set p .[[Key]] to
empty .
Set p .[[Value]] to
empty .
Return true .
Return false .
Note
The value empty is used as a specification device to indicate
that an entry has been deleted. Actual implementations may take other actions such
as physically removing the entry from internal data structures.
24.3.3.3 WeakMap.prototype.get ( key )
This method performs the following steps when called:
Let M be the this value.
Perform ? RequireInternalSlot (M ,
[[WeakMapData]] ).
If CanBeHeldWeakly (key )
is false , return undefined .
For each Record { [[Key]] , [[Value]] }
p of M .[[WeakMapData]] , do
If p .[[Key]] is not
empty and SameValue (p .[[Key]] , key ) is true ,
return p .[[Value]] .
Return undefined .
24.3.3.4 WeakMap.prototype.has ( key )
This method performs the following steps when called:
Let M be the this value.
Perform ? RequireInternalSlot (M ,
[[WeakMapData]] ).
If CanBeHeldWeakly (key )
is false , return false .
For each Record { [[Key]] , [[Value]] }
p of M .[[WeakMapData]] , do
If p .[[Key]] is not
empty and SameValue (p .[[Key]] , key ) is true ,
return true .
Return false .
24.3.3.5 WeakMap.prototype.set ( key ,
value )
This method performs the following steps when called:
Let M be the this value.
Perform ? RequireInternalSlot (M ,
[[WeakMapData]] ).
If CanBeHeldWeakly (key )
is false , throw a TypeError exception.
For each Record { [[Key]] , [[Value]] }
p of M .[[WeakMapData]] , do
If p .[[Key]] is not
empty and SameValue (p .[[Key]] , key ) is true ,
then
Set p .[[Value]] to
value .
Return M .
Let p be the Record { [[Key]] : key , [[Value]] :
value }.
Append p to M .[[WeakMapData]] .
Return M .
24.3.3.6 WeakMap.prototype [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is the
String value "WeakMap" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
24.3.4 Properties of WeakMap Instances
WeakMap instances are ordinary objects that inherit properties from the
WeakMap prototype
object . WeakMap instances also have a [[WeakMapData]] internal slot.
24.4 WeakSet Objects
WeakSets are collections of objects and/or symbols. A distinct object or symbol may only occur once
as an element of a WeakSet's collection. A WeakSet may be queried to see if it contains a specific
value, but no mechanism is provided for enumerating the values it holds. In certain conditions,
values which are not live are removed as WeakSet elements, as described in
9.9.3 .
An implementation may impose an arbitrarily determined latency between the time a value contained in
a WeakSet becomes inaccessible and the time when the value is removed from the WeakSet. If this
latency was observable to ECMAScript program, it would be a source of indeterminacy that could
impact program execution. For that reason, an ECMAScript implementation must not provide any means
to determine if a WeakSet contains a particular value that does not require the observer to present
the observed value.
WeakSets must be implemented using either hash tables or other mechanisms that, on average, provide
access times that are sublinear on the number of elements in the collection. The data structure used
in this specification is only intended to describe the required observable semantics of WeakSets. It
is not intended to be a viable implementation model.
Note
24.4.1 The WeakSet Constructor
The WeakSet constructor :
is %WeakSet% .
is the initial value of the "WeakSet" property of the global
object .
creates and initializes a new WeakSet when called as a constructor .
is not intended to be called as a function and will throw an exception when called in that
manner.
may be used as the value in an extends clause of a class definition. Subclass
constructors that intend to inherit the specified
WeakSet behaviour must include a super call to the WeakSet constructor to
create and initialize the subclass instance with the internal state necessary to support the
WeakSet.prototype built-in methods.
24.4.1.1 WeakSet ( [ iterable ] )
This function performs the following steps when called:
If NewTarget is undefined , throw a TypeError
exception.
Let set be ? OrdinaryCreateFromConstructor (NewTarget,
"%WeakSet.prototype%" , « [[WeakSetData]] »).
Set set .[[WeakSetData]] to a new empty List .
If iterable is either undefined or
null , return set .
Let adder be ? Get (set ,
"add" ).
If IsCallable (adder ) is
false , throw a TypeError exception.
Let iteratorRecord be ? GetIterator (iterable ,
sync ).
Repeat,
Let next be ? IteratorStepValue (iteratorRecord ).
If next is done , return set .
Let status be Completion (Call (adder ,
set , « next »)).
IfAbruptCloseIterator (status ,
iteratorRecord ).
24.4.2 Properties of the WeakSet Constructor
The WeakSet constructor :
has a [[Prototype]] internal slot whose value is %Function.prototype% .
has the following properties:
24.4.2.1 WeakSet.prototype
The initial value of WeakSet.prototype is the WeakSet prototype
object .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }.
24.4.3 Properties of the WeakSet Prototype Object
The WeakSet prototype object :
24.4.3.1 WeakSet.prototype.add ( value )
This method performs the following steps when called:
Let S be the this value.
Perform ? RequireInternalSlot (S ,
[[WeakSetData]] ).
If CanBeHeldWeakly (value )
is false , throw a TypeError exception.
For each element e of S .[[WeakSetData]] , do
If e is not empty and SameValue (e ,
value ) is true , then
Return S .
Append value to S .[[WeakSetData]] .
Return S .
24.4.3.2 WeakSet.prototype.constructor
The initial value of WeakSet.prototype.constructor is %WeakSet% .
24.4.3.3 WeakSet.prototype.delete ( value )
This method performs the following steps when called:
Let S be the this value.
Perform ? RequireInternalSlot (S ,
[[WeakSetData]] ).
If CanBeHeldWeakly (value )
is false , return false .
For each element e of S .[[WeakSetData]] , do
If e is not empty and SameValue (e ,
value ) is true , then
Replace the element of S .[[WeakSetData]] whose value is e
with an element whose value is empty .
Return true .
Return false .
Note
The value empty is used as a specification device to indicate
that an entry has been deleted. Actual implementations may take other actions such
as physically removing the entry from internal data structures.
24.4.3.4 WeakSet.prototype.has ( value )
This method performs the following steps when called:
Let S be the this value.
Perform ? RequireInternalSlot (S ,
[[WeakSetData]] ).
If CanBeHeldWeakly (value )
is false , return false .
For each element e of S .[[WeakSetData]] , do
If e is not empty and SameValue (e ,
value ) is true , return
true .
Return false .
24.4.3.5 WeakSet.prototype [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is the
String value "WeakSet" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
24.4.4 Properties of WeakSet Instances
WeakSet instances are ordinary objects that inherit properties from the
WeakSet prototype
object . WeakSet instances also have a [[WeakSetData]] internal slot.
24.5 Abstract Operations for Keyed Collections
24.5.1 CanonicalizeKeyedCollectionKey ( key )
The abstract operation CanonicalizeKeyedCollectionKey takes argument key (an ECMAScript language value ) and
returns an ECMAScript language value . It
performs the following steps when called:
If key is -0 𝔽 , return
+0 𝔽 .
Return key .
25 Structured Data
25.1 ArrayBuffer Objects
25.1.1 Notation
The descriptions below in this section, 25.4 , and 29 use the read-modify-write
modification function internal data structure.
A read-modify-write
modification function is a mathematical function that is represented as an abstract
closure that takes two Lists of
byte
values as arguments and returns a List of byte
values . These abstract closures satisfy all of the following properties:
They perform all their algorithm steps atomically.
Their individual algorithm steps are not observable.
Note
To aid verifying that a read-modify-write modification function's algorithm steps
constitute a pure, mathematical function, the following editorial conventions are
recommended:
25.1.2 Fixed-length and Resizable ArrayBuffer Objects
A fixed-length ArrayBuffer is an ArrayBuffer whose byte length cannot
change after creation.
A resizable ArrayBuffer is an ArrayBuffer whose byte length may change
after creation via calls to ArrayBuffer.prototype.resize (
newLength ) .
The kind of ArrayBuffer object that is created depends on the arguments passed to ArrayBuffer ( length [ , options ]
) .
25.1.3 Abstract Operations For ArrayBuffer Objects
25.1.3.1 AllocateArrayBuffer ( constructor ,
byteLength [ , maxByteLength ] )
The abstract operation AllocateArrayBuffer takes arguments constructor (a
constructor ) and byteLength (a
non-negative integer ) and optional argument
maxByteLength (a non-negative integer or empty ) and returns
either a normal completion
containing an ArrayBuffer or a throw completion . It
is used to create an ArrayBuffer. It performs the following steps when called:
Let slots be « [[ArrayBufferData]] , [[ArrayBufferByteLength]] , [[ArrayBufferDetachKey]] ».
If maxByteLength is present and maxByteLength is not
empty , let allocatingResizableBuffer be
true ; otherwise let allocatingResizableBuffer be
false .
If allocatingResizableBuffer is true , then
If byteLength > maxByteLength , throw a
RangeError exception.
Append [[ArrayBufferMaxByteLength]] to
slots .
Let obj be ? OrdinaryCreateFromConstructor (constructor ,
"%ArrayBuffer.prototype%" , slots ).
Let block be ? CreateByteDataBlock (byteLength ).
Set obj .[[ArrayBufferData]] to block .
Set obj .[[ArrayBufferByteLength]] to
byteLength .
If allocatingResizableBuffer is true , then
If it is not possible to create a Data Block
block consisting of maxByteLength bytes, throw a
RangeError exception.
NOTE: Resizable ArrayBuffers are designed to be implementable with in-place
growth. Implementations may throw if, for example, virtual memory cannot be
reserved up front.
Set obj .[[ArrayBufferMaxByteLength]] to
maxByteLength .
Return obj .
25.1.3.2 ArrayBufferByteLength ( arrayBuffer ,
order )
The abstract operation ArrayBufferByteLength takes arguments arrayBuffer (an
ArrayBuffer or SharedArrayBuffer) and order (seq-cst or
unordered ) and returns a non-negative integer . It performs the following
steps when called:
If IsSharedArrayBuffer (arrayBuffer )
is true and arrayBuffer has an [[ArrayBufferByteLengthData]] internal slot, then
Let bufferByteLengthBlock be arrayBuffer .[[ArrayBufferByteLengthData]] .
Let rawLength be GetRawBytesFromSharedBlock (bufferByteLengthBlock ,
0, biguint64 , true ,
order ).
Let isLittleEndian be the value of the [[LittleEndian]] field of the surrounding agent 's
Agent
Record .
Return ℝ (RawBytesToNumeric (biguint64 ,
rawLength , isLittleEndian )).
Assert :
IsDetachedBuffer (arrayBuffer )
is false .
Return arrayBuffer .[[ArrayBufferByteLength]] .
25.1.3.3 ArrayBufferCopyAndDetach ( arrayBuffer ,
newLength , preserveResizability )
The abstract operation ArrayBufferCopyAndDetach takes arguments arrayBuffer (an
ECMAScript language value ),
newLength (an ECMAScript language value ), and
preserveResizability (preserve-resizability or
fixed-length ) and returns either a normal completion
containing an ArrayBuffer or a throw completion . It
performs the following steps when called:
Perform ? RequireInternalSlot (arrayBuffer ,
[[ArrayBufferData]] ).
If IsSharedArrayBuffer (arrayBuffer )
is true , throw a TypeError exception.
If newLength is undefined , then
Let newByteLength be arrayBuffer .[[ArrayBufferByteLength]] .
Else,
Let newByteLength be ? ToIndex (newLength ).
If IsDetachedBuffer (arrayBuffer )
is true , throw a TypeError exception.
If preserveResizability is preserve-resizability
and IsFixedLengthArrayBuffer (arrayBuffer )
is false , then
Let newMaxByteLength be arrayBuffer .[[ArrayBufferMaxByteLength]] .
Else,
Let newMaxByteLength be empty .
If arrayBuffer .[[ArrayBufferDetachKey]] is not
undefined , throw a TypeError exception.
Let newBuffer be ? AllocateArrayBuffer (%ArrayBuffer% ,
newByteLength , newMaxByteLength ).
Let copyLength be min (newByteLength ,
arrayBuffer .[[ArrayBufferByteLength]] ).
Let fromBlock be arrayBuffer .[[ArrayBufferData]] .
Let toBlock be newBuffer .[[ArrayBufferData]] .
Perform CopyDataBlockBytes (toBlock ,
0, fromBlock , 0, copyLength ).
NOTE: Neither creation of the new Data Block nor copying
from the old Data Block are observable.
Implementations may implement this method as a zero-copy move or a
realloc.
Perform ! DetachArrayBuffer (arrayBuffer ).
Return newBuffer .
25.1.3.4 IsDetachedBuffer ( arrayBuffer )
The abstract operation IsDetachedBuffer takes argument arrayBuffer (an ArrayBuffer
or a SharedArrayBuffer) and returns a Boolean. It performs the following steps when called:
If arrayBuffer .[[ArrayBufferData]] is
null , return true .
Return false .
25.1.3.5 DetachArrayBuffer ( arrayBuffer [ ,
key ] )
The abstract operation DetachArrayBuffer takes argument arrayBuffer (an
ArrayBuffer) and optional argument key (anything) and returns either a normal completion
containing unused or a throw completion . It
performs the following steps when called:
Assert :
IsSharedArrayBuffer (arrayBuffer )
is false .
If key is not present, set key to
undefined .
If arrayBuffer .[[ArrayBufferDetachKey]] is not
key , throw a TypeError exception.
Set arrayBuffer .[[ArrayBufferData]] to
null .
Set arrayBuffer .[[ArrayBufferByteLength]] to 0.
Return unused .
Note
Detaching an ArrayBuffer instance disassociates the Data Block used as its
backing store from the instance and sets the byte length of the buffer to 0.
25.1.3.6 CloneArrayBuffer ( srcBuffer ,
srcByteOffset , srcLength )
The abstract operation CloneArrayBuffer takes arguments srcBuffer (an ArrayBuffer
or a SharedArrayBuffer), srcByteOffset (a non-negative integer ), and srcLength (a
non-negative integer ) and returns either a normal completion
containing an ArrayBuffer or a throw completion . It
creates a new ArrayBuffer whose data is a copy of srcBuffer 's data over the range
starting at srcByteOffset and continuing for srcLength bytes. It
performs the following steps when called:
Assert :
IsDetachedBuffer (srcBuffer )
is false .
Let targetBuffer be ? AllocateArrayBuffer (%ArrayBuffer% ,
srcLength ).
Let srcBlock be srcBuffer .[[ArrayBufferData]] .
Let targetBlock be targetBuffer .[[ArrayBufferData]] .
Perform CopyDataBlockBytes (targetBlock ,
0, srcBlock , srcByteOffset , srcLength ).
Return targetBuffer .
25.1.3.7 GetArrayBufferMaxByteLengthOption ( options
)
The abstract operation GetArrayBufferMaxByteLengthOption takes argument options
(an ECMAScript language value ) and
returns either a normal completion
containing either a non-negative integer or
empty , or a throw completion . It
performs the following steps when called:
If options is not an Object , return
empty .
Let maxByteLength be ? Get (options ,
"maxByteLength" ).
If maxByteLength is undefined , return
empty .
Return ? ToIndex (maxByteLength ).
25.1.3.8 HostResizeArrayBuffer ( buffer ,
newByteLength )
The host-defined abstract operation
HostResizeArrayBuffer takes arguments buffer (an ArrayBuffer) and
newByteLength (a non-negative integer ) and returns either a normal completion
containing either handled or
unhandled , or a throw completion . It
gives the host an
opportunity to perform implementation-defined resizing of
buffer . If the host chooses not to handle resizing of
buffer , it may return unhandled for the default behaviour.
The implementation of HostResizeArrayBuffer must conform to the following requirements:
The abstract operation does not detach buffer .
If the abstract operation completes normally with handled ,
buffer .[[ArrayBufferByteLength]] is
newByteLength .
The default implementation of HostResizeArrayBuffer is to return NormalCompletion (unhandled ).
25.1.3.9 IsFixedLengthArrayBuffer ( arrayBuffer )
The abstract operation IsFixedLengthArrayBuffer takes argument arrayBuffer (an
ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. It performs the following steps
when called:
If arrayBuffer has an [[ArrayBufferMaxByteLength]] internal slot, return
false .
Return true .
25.1.3.10 IsUnsignedElementType ( type )
The abstract operation IsUnsignedElementType takes argument type (a TypedArray element type ) and returns a
Boolean. It verifies if the argument type is an unsigned TypedArray element type . It performs
the following steps when called:
If type is one of uint8 ,
uint8clamped , uint16 ,
uint32 , or biguint64 , return
true .
Return false .
25.1.3.11 IsUnclampedIntegerElementType ( type )
The abstract operation IsUnclampedIntegerElementType takes argument type (a
TypedArray element type ) and returns a
Boolean. It verifies if the argument type is an Integer TypedArray element type not including
uint8clamped . It performs the following steps when called:
If type is one of int8 ,
uint8 , int16 ,
uint16 , int32 , or
uint32 , return true .
Return false .
25.1.3.12 IsBigIntElementType ( type )
The abstract operation IsBigIntElementType takes argument type (a TypedArray element type ) and returns a
Boolean. It verifies if the argument type is a BigInt
TypedArray element type . It performs
the following steps when called:
If type is either biguint64 or
bigint64 , return true .
Return false .
25.1.3.13 IsNoTearConfiguration ( type ,
order )
The abstract operation IsNoTearConfiguration takes arguments type (a TypedArray element type ) and
order (seq-cst , unordered , or
init ) and returns a Boolean. It performs the following steps when
called:
If IsUnclampedIntegerElementType (type )
is true , return true .
If IsBigIntElementType (type )
is true and order is neither
init nor unordered , return
true .
Return false .
25.1.3.14 RawBytesToNumeric ( type ,
rawBytes , isLittleEndian )
The abstract operation RawBytesToNumeric takes arguments type (a TypedArray element type ),
rawBytes (a List of
byte
values ), and isLittleEndian (a Boolean) and returns a
Number or a BigInt. It performs the following steps when called:
Let elementSize be the Element Size value specified in Table 75 for
Element Type type .
If isLittleEndian is false , reverse the order of the
elements of rawBytes .
If type is float16 , then
Let value be the byte elements of rawBytes
concatenated and interpreted as a little-endian bit string encoding of an
IEEE 754-2019 binary16
value.
If value is a NaN, return NaN .
Return the Number value that corresponds to value .
If type is float32 , then
Let value be the byte elements of rawBytes
concatenated and interpreted as a little-endian bit string encoding of an
IEEE 754-2019 binary32
value.
If value is a NaN, return NaN .
Return the Number value that corresponds to value .
If type is float64 , then
Let value be the byte elements of rawBytes
concatenated and interpreted as a little-endian bit string encoding of an
IEEE 754-2019 binary64
value.
If value is a NaN, return NaN .
Return the Number value that corresponds to value .
If IsUnsignedElementType (type )
is true , then
Let intValue be the byte elements of rawBytes
concatenated and interpreted as a bit string encoding of an unsigned
little-endian binary number.
Else,
Let intValue be the byte elements of rawBytes
concatenated and interpreted as a bit string encoding of a binary
little-endian two's complement number of bit length elementSize ×
8.
If IsBigIntElementType (type )
is true , return the BigInt value that corresponds to
intValue .
Otherwise, return the Number value that corresponds to intValue .
25.1.3.15 GetRawBytesFromSharedBlock ( block ,
byteIndex , type , isTypedArray , order )
The abstract operation GetRawBytesFromSharedBlock takes arguments block (a
Shared Data
Block ), byteIndex (a non-negative integer ),
type (a TypedArray element type ),
isTypedArray (a Boolean), and order (seq-cst or
unordered ) and returns a List of byte
values . It performs the following steps when called:
Let elementSize be the Element Size value specified in Table 75 for
Element Type type .
Let execution be the [[CandidateExecution]]
field of the surrounding agent 's Agent
Record .
Let eventsRecord be the Agent Events
Record of execution .[[EventsRecords]] whose [[AgentSignifier]] is AgentSignifier ().
If isTypedArray is true and IsNoTearConfiguration (type ,
order ) is true , let noTear be
true ; otherwise let noTear be
false .
Let rawValue be a List of length
elementSize whose elements are nondeterministically chosen byte
values .
NOTE: In implementations, rawValue is the result of a non-atomic or
atomic read instruction on the underlying hardware. The nondeterminism is a semantic
prescription of the memory model to describe observable
behaviour of hardware with weak consistency.
Let readEvent be ReadSharedMemory { [[Order]] : order , [[NoTear]] : noTear , [[Block]] : block , [[ByteIndex]] : byteIndex , [[ElementSize]] : elementSize }.
Append readEvent to eventsRecord .[[EventList]] .
Append Chosen Value Record { [[Event]] : readEvent , [[ChosenValue]] : rawValue } to
execution .[[ChosenValues]] .
Return rawValue .
25.1.3.16 GetValueFromBuffer ( arrayBuffer ,
byteIndex , type , isTypedArray , order [ ,
isLittleEndian ] )
The abstract operation GetValueFromBuffer takes arguments arrayBuffer (an
ArrayBuffer or SharedArrayBuffer), byteIndex (a non-negative integer ),
type (a TypedArray element type ),
isTypedArray (a Boolean), and order (seq-cst or
unordered ) and optional argument isLittleEndian (a
Boolean) and returns a Number or a BigInt. It performs the following steps when called:
Assert :
IsDetachedBuffer (arrayBuffer )
is false .
Assert :
There are sufficient bytes in arrayBuffer starting at
byteIndex to represent a value of type .
Let block be arrayBuffer .[[ArrayBufferData]] .
Let elementSize be the Element Size value specified in Table 75 for
Element Type type .
If IsSharedArrayBuffer (arrayBuffer )
is true , then
Assert : block is a
Shared Data Block .
Let rawValue be GetRawBytesFromSharedBlock (block ,
byteIndex , type , isTypedArray ,
order ).
Else,
Let rawValue be a List
whose elements are bytes from block at indices in the interval from byteIndex
(inclusive) to byteIndex + elementSize (exclusive).
Assert :
The number of elements in rawValue is elementSize .
If isLittleEndian is not present, set isLittleEndian to the
value of the [[LittleEndian]] field of the surrounding agent 's Agent
Record .
Return RawBytesToNumeric (type ,
rawValue , isLittleEndian ).
25.1.3.17 NumericToRawBytes ( type , value ,
isLittleEndian )
The abstract operation NumericToRawBytes takes arguments type (a TypedArray element type ),
value (a Number or a BigInt), and isLittleEndian (a Boolean) and
returns a List of byte
values . It performs the following steps when called:
If type is float16 , then
Let rawBytes be a List
whose elements are the 2 bytes that are the result of converting
value to IEEE 754-2019 binary16
format using roundTiesToEven mode. The bytes are arranged in little endian
order. If value is NaN , rawBytes
may be set to any implementation chosen IEEE 754-2019
binary16 format NaN encoding. An implementation must always choose the same
encoding for each implementation distinguishable NaN
value.
Else if type is float32 , then
Let rawBytes be a List
whose elements are the 4 bytes that are the result of converting
value to IEEE 754-2019 binary32
format using roundTiesToEven mode. The bytes are arranged in little endian
order. If value is NaN , rawBytes
may be set to any implementation chosen IEEE 754-2019
binary32 format NaN encoding. An implementation must always choose the same
encoding for each implementation distinguishable NaN
value.
Else if type is float64 , then
Let rawBytes be a List
whose elements are the 8 bytes that are the IEEE 754-2019 binary64
format encoding of value . The bytes are arranged in little endian
order. If value is NaN , rawBytes
may be set to any implementation chosen IEEE 754-2019
binary64 format NaN encoding. An implementation must always choose the same
encoding for each implementation distinguishable NaN
value.
Else,
Let n be the Element Size value specified in Table 75
for Element Type type .
Let conversionOperation be the abstract operation named in the
Conversion Operation column in Table 75
for Element Type type .
Let intValue be ℝ (!
conversionOperation (value )).
If intValue ≥ 0, then
Let rawBytes be a List
whose elements are the n -byte binary encoding of
intValue . The bytes are ordered in little endian order.
Else,
Let rawBytes be a List
whose elements are the n -byte binary two's complement
encoding of intValue . The bytes are ordered in little
endian order.
If isLittleEndian is false , reverse the order of the
elements of rawBytes .
Return rawBytes .
25.1.3.18 SetValueInBuffer ( arrayBuffer ,
byteIndex , type , value , isTypedArray ,
order [ , isLittleEndian ] )
The abstract operation SetValueInBuffer takes arguments arrayBuffer (an
ArrayBuffer or SharedArrayBuffer), byteIndex (a non-negative integer ),
type (a TypedArray element type ),
value (a Number or a BigInt), isTypedArray (a Boolean), and
order (seq-cst , unordered , or
init ) and optional argument isLittleEndian (a Boolean) and
returns unused . It performs the following steps when called:
Assert :
IsDetachedBuffer (arrayBuffer )
is false .
Assert :
There are sufficient bytes in arrayBuffer starting at
byteIndex to represent a value of type .
Assert :
value is a
BigInt if IsBigIntElementType (type )
is true ; otherwise, value is a
Number .
Let block be arrayBuffer .[[ArrayBufferData]] .
Let elementSize be the Element Size value specified in Table 75 for
Element Type type .
If isLittleEndian is not present, set isLittleEndian to the
value of the [[LittleEndian]] field of the surrounding agent 's Agent
Record .
Let rawBytes be NumericToRawBytes (type ,
value , isLittleEndian ).
If IsSharedArrayBuffer (arrayBuffer )
is true , then
Let execution be the [[CandidateExecution]] field of the surrounding agent 's
Agent
Record .
Let eventsRecord be the Agent Events
Record of execution .[[EventsRecords]] whose [[AgentSignifier]] is AgentSignifier ().
If isTypedArray is true and IsNoTearConfiguration (type ,
order ) is true , let noTear be
true ; otherwise let noTear be
false .
Append WriteSharedMemory
{ [[Order]] : order , [[NoTear]] : noTear , [[Block]] : block , [[ByteIndex]] : byteIndex , [[ElementSize]] : elementSize , [[Payload]] : rawBytes } to
eventsRecord .[[EventList]] .
Else,
Store the individual bytes of rawBytes into block ,
starting at block [byteIndex ].
Return unused .
25.1.3.19 GetModifySetValueInBuffer ( arrayBuffer ,
byteIndex , type , value , op )
The abstract operation GetModifySetValueInBuffer takes arguments arrayBuffer (an
ArrayBuffer or a SharedArrayBuffer), byteIndex (a non-negative integer ),
type (a TypedArray element type ),
value (a Number or a BigInt), and op (a read-modify-write modification
function ) and returns a Number or a BigInt. It performs the following
steps when called:
Assert :
IsDetachedBuffer (arrayBuffer )
is false .
Assert :
There are sufficient bytes in arrayBuffer starting at
byteIndex to represent a value of type .
Assert :
value is a
BigInt if IsBigIntElementType (type )
is true ; otherwise, value is a
Number .
Let block be arrayBuffer .[[ArrayBufferData]] .
Let elementSize be the Element Size value specified in Table 75 for
Element Type type .
Let isLittleEndian be the value of the [[LittleEndian]] field of the surrounding agent 's Agent
Record .
Let rawBytes be NumericToRawBytes (type ,
value , isLittleEndian ).
If IsSharedArrayBuffer (arrayBuffer )
is true , then
Let execution be the [[CandidateExecution]] field of the surrounding agent 's
Agent
Record .
Let eventsRecord be the Agent Events
Record of execution .[[EventsRecords]] whose [[AgentSignifier]] is AgentSignifier ().
Let rawBytesRead be a List
of length elementSize whose elements are nondeterministically
chosen byte values .
NOTE: In implementations, rawBytesRead is the result of a
load-link, of a load-exclusive, or of an operand of a read-modify-write
instruction on the underlying hardware. The nondeterminism is a semantic
prescription of the memory model to describe
observable behaviour of hardware with weak consistency.
Let rmwEvent be ReadModifyWriteSharedMemory
{ [[Order]] : seq-cst , [[NoTear]] : true , [[Block]] : block , [[ByteIndex]] : byteIndex , [[ElementSize]] : elementSize , [[Payload]] : rawBytes , [[ModifyOp]] : op }.
Append rmwEvent to eventsRecord .[[EventList]] .
Append Chosen Value Record
{ [[Event]] : rmwEvent , [[ChosenValue]] : rawBytesRead } to
execution .[[ChosenValues]] .
Else,
Let rawBytesRead be a List
of length elementSize whose elements are the sequence of
elementSize bytes starting with
block [byteIndex ].
Let rawBytesModified be op (rawBytesRead ,
rawBytes ).
Store the individual bytes of rawBytesModified into
block , starting at block [byteIndex ].
Return RawBytesToNumeric (type ,
rawBytesRead , isLittleEndian ).
25.1.4 The ArrayBuffer Constructor
The ArrayBuffer constructor :
is %ArrayBuffer% .
is the initial value of the "ArrayBuffer" property of the global
object .
creates and initializes a new ArrayBuffer when called as a constructor .
is not intended to be called as a function and will throw an exception when called in that
manner.
may be used as the value of an extends clause of a class definition. Subclass
constructors that intend to inherit the specified
ArrayBuffer behaviour must include a super call to the ArrayBuffer constructor to
create and initialize subclass instances with the internal state necessary to support the
ArrayBuffer.prototype built-in methods.
25.1.4.1 ArrayBuffer ( length [ , options
] )
This function performs the following steps when called:
If NewTarget is undefined , throw a TypeError
exception.
Let byteLength be ? ToIndex (length ).
Let requestedMaxByteLength be ? GetArrayBufferMaxByteLengthOption (options ).
Return ? AllocateArrayBuffer (NewTarget,
byteLength , requestedMaxByteLength ).
25.1.5 Properties of the ArrayBuffer Constructor
The ArrayBuffer constructor :
has a [[Prototype]] internal slot whose value is %Function.prototype% .
has the following properties:
25.1.5.1 ArrayBuffer.isView ( arg )
This function performs the following steps when called:
If arg is not an Object , return
false .
If arg has a [[ViewedArrayBuffer]] internal
slot, return true .
Return false .
25.1.5.2 ArrayBuffer.prototype
The initial value of ArrayBuffer.prototype is the ArrayBuffer prototype
object .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }.
25.1.5.3 get ArrayBuffer [ %Symbol.species% ]
ArrayBuffer[%Symbol.species%] is an accessor property whose set
accessor function is undefined . Its get accessor function performs the
following steps when called:
Return the this value.
The value of the "name" property of this function is "get
[Symbol.species]" .
Note
ArrayBuffer.prototype.slice (
start , end ) normally uses its
this value's constructor to create a derived object.
However, a subclass constructor may over-ride that default
behaviour for the ArrayBuffer.prototype.slice (
start , end ) method by redefining its
%Symbol.species% property.
25.1.6 Properties of the ArrayBuffer Prototype Object
The ArrayBuffer prototype object :
is %ArrayBuffer.prototype% .
has a [[Prototype]] internal slot whose value is %Object.prototype% .
is an ordinary
object .
does not have an [[ArrayBufferData]] or [[ArrayBufferByteLength]] internal slot.
25.1.6.1 get ArrayBuffer.prototype.byteLength
ArrayBuffer.prototype.byteLength is an accessor property whose set
accessor function is undefined . Its get accessor function performs the
following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[ArrayBufferData]] ).
If IsSharedArrayBuffer (O )
is true , throw a TypeError exception.
If IsDetachedBuffer (O )
is true , return +0 𝔽 .
Let length be O .[[ArrayBufferByteLength]] .
Return 𝔽 (length ).
25.1.6.2 ArrayBuffer.prototype.constructor
The initial value of ArrayBuffer.prototype.constructor is %ArrayBuffer% .
25.1.6.3 get ArrayBuffer.prototype.detached
ArrayBuffer.prototype.detached is an accessor property whose set
accessor function is undefined . Its get accessor function performs the
following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[ArrayBufferData]] ).
If IsSharedArrayBuffer (O )
is true , throw a TypeError exception.
Return IsDetachedBuffer (O ).
25.1.6.4 get ArrayBuffer.prototype.maxByteLength
ArrayBuffer.prototype.maxByteLength is an accessor property whose set
accessor function is undefined . Its get accessor function performs the
following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[ArrayBufferData]] ).
If IsSharedArrayBuffer (O )
is true , throw a TypeError exception.
If IsDetachedBuffer (O )
is true , return +0 𝔽 .
If IsFixedLengthArrayBuffer (O )
is true , then
Let length be O .[[ArrayBufferByteLength]] .
Else,
Let length be O .[[ArrayBufferMaxByteLength]] .
Return 𝔽 (length ).
25.1.6.5 get ArrayBuffer.prototype.resizable
ArrayBuffer.prototype.resizable is an accessor property whose set
accessor function is undefined . Its get accessor function performs the
following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[ArrayBufferData]] ).
If IsSharedArrayBuffer (O )
is true , throw a TypeError exception.
If IsFixedLengthArrayBuffer (O )
is false , return true ; otherwise return
false .
25.1.6.6 ArrayBuffer.prototype.resize ( newLength )
This method performs the following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[ArrayBufferMaxByteLength]] ).
If IsSharedArrayBuffer (O )
is true , throw a TypeError exception.
Let newByteLength be ? ToIndex (newLength ).
If IsDetachedBuffer (O )
is true , throw a TypeError exception.
If newByteLength > O .[[ArrayBufferMaxByteLength]] , throw a
RangeError exception.
Let hostHandled be ? HostResizeArrayBuffer (O ,
newByteLength ).
If hostHandled is handled , return
undefined .
Let oldBlock be O .[[ArrayBufferData]] .
Let newBlock be ? CreateByteDataBlock (newByteLength ).
Let copyLength be min (newByteLength ,
O .[[ArrayBufferByteLength]] ).
Perform CopyDataBlockBytes (newBlock ,
0, oldBlock , 0, copyLength ).
NOTE: Neither creation of the new Data Block nor copying
from the old Data Block are observable.
Implementations may implement this method as in-place growth or shrinkage.
Set O .[[ArrayBufferData]] to
newBlock .
Set O .[[ArrayBufferByteLength]] to
newByteLength .
Return undefined .
25.1.6.7 ArrayBuffer.prototype.slice ( start ,
end )
This method performs the following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[ArrayBufferData]] ).
If IsSharedArrayBuffer (O )
is true , throw a TypeError exception.
If IsDetachedBuffer (O )
is true , throw a TypeError exception.
Let len be O .[[ArrayBufferByteLength]] .
Let relativeStart be ? ToIntegerOrInfinity (start ).
If relativeStart = -∞, let first be 0.
Else if relativeStart < 0, let first be max (len
+ relativeStart , 0).
Else, let first be min (relativeStart ,
len ).
If end is undefined , let relativeEnd be
len ; else let relativeEnd be ? ToIntegerOrInfinity (end ).
If relativeEnd = -∞, let final be 0.
Else if relativeEnd < 0, let final be max (len +
relativeEnd , 0).
Else, let final be min (relativeEnd , len ).
Let newLen be max (final - first , 0).
Let ctor be ? SpeciesConstructor (O ,
%ArrayBuffer% ).
Let new be ? Construct (ctor , « 𝔽 (newLen ) »).
Perform ? RequireInternalSlot (new ,
[[ArrayBufferData]] ).
If IsSharedArrayBuffer (new )
is true , throw a TypeError exception.
If IsDetachedBuffer (new )
is true , throw a TypeError exception.
If SameValue (new , O )
is true , throw a TypeError exception.
If new .[[ArrayBufferByteLength]] <
newLen , throw a TypeError exception.
NOTE: Side-effects of the above steps may have detached or resized O .
If IsDetachedBuffer (O )
is true , throw a TypeError exception.
Let fromBuf be O .[[ArrayBufferData]] .
Let toBuf be new .[[ArrayBufferData]] .
Let currentLen be O .[[ArrayBufferByteLength]] .
If first < currentLen , then
Let count be min (newLen ,
currentLen - first ).
Perform CopyDataBlockBytes (toBuf ,
0, fromBuf , first , count ).
Return new .
25.1.6.8 ArrayBuffer.prototype.transfer ( [ newLength
] )
This method performs the following steps when called:
Let O be the this value.
Return ? ArrayBufferCopyAndDetach (O ,
newLength , preserve-resizability ).
25.1.6.9 ArrayBuffer.prototype.transferToFixedLength ( [
newLength ] )
This method performs the following steps when called:
Let O be the this value.
Return ? ArrayBufferCopyAndDetach (O ,
newLength , fixed-length ).
25.1.6.10 ArrayBuffer.prototype [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is the
String value "ArrayBuffer" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
25.1.7 Properties of ArrayBuffer Instances
ArrayBuffer instances inherit properties from the ArrayBuffer prototype
object . ArrayBuffer instances each have an [[ArrayBufferData]] internal slot, an [[ArrayBufferByteLength]] internal slot, and an [[ArrayBufferDetachKey]] internal slot. ArrayBuffer instances which are
resizable each have an [[ArrayBufferMaxByteLength]] internal slot.
ArrayBuffer instances whose [[ArrayBufferData]] is
null are considered to be detached and all operators to access or modify data
contained in the ArrayBuffer instance will fail.
ArrayBuffer instances whose [[ArrayBufferDetachKey]] is set to a value
other than undefined need to have all DetachArrayBuffer calls
passing that same "detach key" as an argument, otherwise a TypeError will result. This internal
slot is only ever set by certain embedding environments, not by algorithms in this
specification.
25.1.8 Resizable ArrayBuffer Guidelines
Note 1
The following are guidelines for ECMAScript programmers working with resizable
ArrayBuffer .
We recommend that programs be tested in their deployment environments where possible. The
amount of available physical memory differs greatly between hardware devices. Similarly,
virtual memory subsystems also differ greatly between hardware devices as well as
operating systems. An application that runs without out-of-memory errors on a 64-bit
desktop web browser could run out of memory on a 32-bit mobile web browser.
When choosing a value for the "maxByteLength" option for resizable
ArrayBuffer , we recommend that the smallest possible size for the
application be chosen. We recommend that "maxByteLength" does not
exceed 1,073,741,824 (230 bytes or 1GiB).
Please note that successfully constructing a resizable
ArrayBuffer for a particular maximum size does not guarantee that
future resizes will succeed.
Note 2
The following are guidelines for ECMAScript implementers implementing resizable
ArrayBuffer .
Resizable
ArrayBuffer can be implemented as copying upon resize, as
in-place growth via reserving virtual memory up front, or as a combination of both for
different values of the constructor 's
"maxByteLength" option.
If a host is
multi-tenanted (i.e. it runs many ECMAScript applications simultaneously), such as a web
browser, and its implementations choose to implement in-place growth by reserving
virtual memory, we recommend that both 32-bit and 64-bit implementations throw for
values of "maxByteLength" ≥ 1GiB to 1.5GiB. This is to reduce the
likelihood a single application can exhaust the virtual memory address space and to
reduce interoperability risk.
If a host does not
have virtual memory, such as those running on embedded devices without an MMU, or if a
host only
implements resizing by copying, it may accept any Number value
for the "maxByteLength" option. However, we
recommend a RangeError be thrown if a memory block of the requested
size can never be allocated. For example, if the requested size is greater than the
maximum amount of usable memory on the device.
25.2 SharedArrayBuffer Objects
25.2.1 Fixed-length and Growable SharedArrayBuffer Objects
A fixed-length SharedArrayBuffer is a SharedArrayBuffer whose byte
length cannot change after creation.
A growable SharedArrayBuffer is a SharedArrayBuffer whose byte length
may increase after creation via calls to SharedArrayBuffer.prototype.grow (
newLength ) .
The kind of SharedArrayBuffer object that is created depends on the arguments passed to SharedArrayBuffer ( length [ ,
options ] ) .
25.2.2 Abstract Operations for SharedArrayBuffer Objects
25.2.2.1 AllocateSharedArrayBuffer ( constructor ,
byteLength [ , maxByteLength ] )
The abstract operation AllocateSharedArrayBuffer takes arguments constructor (a
constructor ) and byteLength (a
non-negative integer ) and optional argument
maxByteLength (a non-negative integer or empty ) and returns
either a normal completion
containing a SharedArrayBuffer or a throw completion . It
is used to create a SharedArrayBuffer. It performs the following steps when called:
Let slots be « [[ArrayBufferData]] ».
If maxByteLength is present and maxByteLength is not
empty , let allocatingGrowableBuffer be
true ; otherwise let allocatingGrowableBuffer be
false .
If allocatingGrowableBuffer is true , then
If byteLength > maxByteLength , throw a
RangeError exception.
Append [[ArrayBufferByteLengthData]] and [[ArrayBufferMaxByteLength]] to slots .
Else,
Append [[ArrayBufferByteLength]] to
slots .
Let obj be ? OrdinaryCreateFromConstructor (constructor ,
"%SharedArrayBuffer.prototype%" , slots ).
If allocatingGrowableBuffer is true , let
allocLength be maxByteLength ; otherwise let
allocLength be byteLength .
Let block be ? CreateSharedByteDataBlock (allocLength ).
Set obj .[[ArrayBufferData]] to block .
If allocatingGrowableBuffer is true , then
Assert : byteLength ≤
maxByteLength .
Let byteLengthBlock be ? CreateSharedByteDataBlock (8).
Perform SetValueInBuffer (byteLengthBlock ,
0, biguint64 , ℤ (byteLength ),
true , seq-cst ).
Set obj .[[ArrayBufferByteLengthData]] to
byteLengthBlock .
Set obj .[[ArrayBufferMaxByteLength]] to
maxByteLength .
Else,
Set obj .[[ArrayBufferByteLength]] to
byteLength .
Return obj .
25.2.2.2 IsSharedArrayBuffer ( obj )
The abstract operation IsSharedArrayBuffer takes argument obj (an ArrayBuffer or a
SharedArrayBuffer) and returns a Boolean. It tests whether an object is an ArrayBuffer, a
SharedArrayBuffer, or a subtype of either. It performs the following steps when called:
Let bufferData be obj .[[ArrayBufferData]] .
If bufferData is null , return
false .
If bufferData is a Data Block , return
false .
Assert :
bufferData is a Shared Data Block .
Return true .
25.2.2.3 HostGrowSharedArrayBuffer ( buffer ,
newByteLength )
The host-defined abstract operation
HostGrowSharedArrayBuffer takes arguments buffer (a SharedArrayBuffer) and
newByteLength (a non-negative integer ) and returns either a normal completion
containing either handled or
unhandled , or a throw completion . It
gives the host an
opportunity to perform implementation-defined growing of
buffer . If the host chooses not to handle growing of buffer ,
it may return unhandled for the default behaviour.
The implementation of HostGrowSharedArrayBuffer must conform to the following requirements:
If the abstract operation does not complete normally with
unhandled , and newByteLength < the current byte
length of the buffer or newByteLength > buffer .[[ArrayBufferMaxByteLength]] , throw a
RangeError exception.
Let isLittleEndian be the value of the [[LittleEndian]] field of the surrounding
agent 's Agent Record . If the abstract operation
completes normally with handled , a WriteSharedMemory or
ReadModifyWriteSharedMemory
event whose [[Order]] is seq-cst , [[Payload]] is NumericToRawBytes (biguint64 ,
newByteLength , isLittleEndian ), [[Block]]
is buffer .[[ArrayBufferByteLengthData]] , [[ByteIndex]] is 0, and [[ElementSize]]
is 8 is added to the surrounding agent 's candidate execution such that
racing calls to SharedArrayBuffer.prototype.grow are not "lost", i.e.
silently do nothing.
Note
The second requirement above is intentionally vague about how or when the current
byte length of buffer is read. Because the byte length must be updated
via an atomic read-modify-write operation on the underlying hardware, architectures
that use load-link/store-conditional or load-exclusive/store-exclusive instruction
pairs may wish to keep the paired instructions close in the instruction stream. As
such, SharedArrayBuffer.prototype.grow itself does not perform bounds checking on
newByteLength before calling HostGrowSharedArrayBuffer, nor is there a
requirement on when the current byte length is read.
This is in contrast with HostResizeArrayBuffer ,
which is guaranteed that the value of newByteLength is ≥ 0 and ≤
buffer .[[ArrayBufferMaxByteLength]] .
The default implementation of HostGrowSharedArrayBuffer is to return NormalCompletion (unhandled ).
25.2.3 The SharedArrayBuffer Constructor
The SharedArrayBuffer constructor :
is %SharedArrayBuffer% .
is the initial value of the "SharedArrayBuffer" property of the global
object , if that property is present (see below).
creates and initializes a new SharedArrayBuffer when called as a constructor .
is not intended to be called as a function and will throw an exception when called in that
manner.
may be used as the value of an extends clause of a class definition. Subclass
constructors that intend to inherit the specified
SharedArrayBuffer behaviour must include a super call to the SharedArrayBuffer
constructor to create and initialize subclass
instances with the internal state necessary to support the
SharedArrayBuffer.prototype built-in methods.
Whenever a host does not
provide concurrent access to SharedArrayBuffers it may omit the
"SharedArrayBuffer" property of the global object .
Note
Unlike an ArrayBuffer, a SharedArrayBuffer cannot become
detached, and its internal [[ArrayBufferData]] slot is never
null .
25.2.3.1 SharedArrayBuffer ( length [ ,
options ] )
This function performs the following steps when called:
If NewTarget is undefined , throw a TypeError
exception.
Let byteLength be ? ToIndex (length ).
Let requestedMaxByteLength be ? GetArrayBufferMaxByteLengthOption (options ).
Return ? AllocateSharedArrayBuffer (NewTarget,
byteLength , requestedMaxByteLength ).
25.2.4 Properties of the SharedArrayBuffer Constructor
The SharedArrayBuffer constructor :
has a [[Prototype]] internal slot whose value is %Function.prototype% .
has the following properties:
25.2.4.1 SharedArrayBuffer.prototype
The initial value of SharedArrayBuffer.prototype is the SharedArrayBuffer
prototype object .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }.
25.2.4.2 get SharedArrayBuffer [ %Symbol.species% ]
SharedArrayBuffer[%Symbol.species%] is an accessor property whose set
accessor function is undefined . Its get accessor function performs the
following steps when called:
Return the this value.
The value of the "name" property of this function is "get
[Symbol.species]" .
25.2.5 Properties of the SharedArrayBuffer Prototype Object
The SharedArrayBuffer prototype object :
is %SharedArrayBuffer.prototype% .
has a [[Prototype]] internal slot whose value is %Object.prototype% .
is an ordinary
object .
does not have an [[ArrayBufferData]] or [[ArrayBufferByteLength]] internal slot.
25.2.5.1 get SharedArrayBuffer.prototype.byteLength
SharedArrayBuffer.prototype.byteLength is an accessor property whose set
accessor function is undefined . Its get accessor function performs the
following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[ArrayBufferData]] ).
If IsSharedArrayBuffer (O )
is false , throw a TypeError exception.
Let length be ArrayBufferByteLength (O ,
seq-cst ).
Return 𝔽 (length ).
25.2.5.2 SharedArrayBuffer.prototype.constructor
The initial value of SharedArrayBuffer.prototype.constructor is %SharedArrayBuffer% .
25.2.5.3 SharedArrayBuffer.prototype.grow ( newLength
)
This method performs the following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[ArrayBufferMaxByteLength]] ).
If IsSharedArrayBuffer (O )
is false , throw a TypeError exception.
Let newByteLength be ? ToIndex (newLength ).
Let hostHandled be ? HostGrowSharedArrayBuffer (O ,
newByteLength ).
If hostHandled is handled , return
undefined .
Let isLittleEndian be the value of the [[LittleEndian]] field of the surrounding agent 's Agent
Record .
Let byteLengthBlock be O .[[ArrayBufferByteLengthData]] .
Let currentByteLengthRawBytes be GetRawBytesFromSharedBlock (byteLengthBlock ,
0, biguint64 , true ,
seq-cst ).
Let newByteLengthRawBytes be NumericToRawBytes (biguint64 ,
ℤ (newByteLength ),
isLittleEndian ).
Repeat,
NOTE: This is a compare-and-exchange loop to ensure that parallel, racing
grows of the same buffer are totally ordered, are not lost, and do not
silently do nothing. The loop exits if it was able to attempt to grow
uncontended.
Let currentByteLength be ℝ (RawBytesToNumeric (biguint64 ,
currentByteLengthRawBytes , isLittleEndian )).
If newByteLength = currentByteLength , return
undefined .
If newByteLength < currentByteLength or
newByteLength > O .[[ArrayBufferMaxByteLength]] , throw a
RangeError exception.
Let byteLengthDelta be newByteLength -
currentByteLength .
If it is impossible to create a new Shared Data
Block value consisting of byteLengthDelta
bytes, throw a RangeError exception.
NOTE: No new Shared Data Block is
constructed and used here. The observable behaviour of growable
SharedArrayBuffers is specified by allocating a max -sized Shared Data Block at
construction time, and this step captures the requirement that
implementations that run out of memory must throw a
RangeError .
Let readByteLengthRawBytes be AtomicCompareExchangeInSharedBlock (byteLengthBlock ,
0, 8, currentByteLengthRawBytes ,
newByteLengthRawBytes ).
If ByteListEqual (readByteLengthRawBytes ,
currentByteLengthRawBytes ) is true , return
undefined .
Set currentByteLengthRawBytes to
readByteLengthRawBytes .
Note
Spurious failures of the compare-exchange to update the length are prohibited. If the
bounds checking for the new length passes and the implementation is not out of
memory, a ReadModifyWriteSharedMemory
event (i.e. a successful compare-exchange) is always added into the candidate execution .
Parallel calls to SharedArrayBuffer.prototype.grow are totally ordered. For example,
consider two racing calls: sab.grow(10) and sab.grow(20).
One of the two calls is guaranteed to win the race. The call to
sab.grow(10) will never shrink sab even if
sab.grow(20) happened first; in that case it will instead throw a
RangeError.
25.2.5.4 get SharedArrayBuffer.prototype.growable
SharedArrayBuffer.prototype.growable is an accessor property whose set
accessor function is undefined . Its get accessor function performs the
following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[ArrayBufferData]] ).
If IsSharedArrayBuffer (O )
is false , throw a TypeError exception.
If IsFixedLengthArrayBuffer (O )
is false , return true ; otherwise return
false .
25.2.5.5 get SharedArrayBuffer.prototype.maxByteLength
SharedArrayBuffer.prototype.maxByteLength is an accessor
property whose set accessor function is undefined .
Its get accessor function performs the following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[ArrayBufferData]] ).
If IsSharedArrayBuffer (O )
is false , throw a TypeError exception.
If IsFixedLengthArrayBuffer (O )
is true , then
Let length be O .[[ArrayBufferByteLength]] .
Else,
Let length be O .[[ArrayBufferMaxByteLength]] .
Return 𝔽 (length ).
25.2.5.6 SharedArrayBuffer.prototype.slice ( start ,
end )
This method performs the following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[ArrayBufferData]] ).
If IsSharedArrayBuffer (O )
is false , throw a TypeError exception.
Let len be ArrayBufferByteLength (O ,
seq-cst ).
Let relativeStart be ? ToIntegerOrInfinity (start ).
If relativeStart = -∞, let first be 0.
Else if relativeStart < 0, let first be max (len
+ relativeStart , 0).
Else, let first be min (relativeStart ,
len ).
If end is undefined , let relativeEnd be
len ; else let relativeEnd be ? ToIntegerOrInfinity (end ).
If relativeEnd = -∞, let final be 0.
Else if relativeEnd < 0, let final be max (len +
relativeEnd , 0).
Else, let final be min (relativeEnd , len ).
Let newLen be max (final - first , 0).
Let ctor be ? SpeciesConstructor (O ,
%SharedArrayBuffer% ).
Let new be ? Construct (ctor , « 𝔽 (newLen ) »).
Perform ? RequireInternalSlot (new ,
[[ArrayBufferData]] ).
If IsSharedArrayBuffer (new )
is false , throw a TypeError exception.
If new .[[ArrayBufferData]] is O .[[ArrayBufferData]] , throw a TypeError
exception.
If ArrayBufferByteLength (new ,
seq-cst ) < newLen , throw a
TypeError exception.
Let fromBuf be O .[[ArrayBufferData]] .
Let toBuf be new .[[ArrayBufferData]] .
Perform CopyDataBlockBytes (toBuf ,
0, fromBuf , first , newLen ).
Return new .
25.2.5.7 SharedArrayBuffer.prototype [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is the
String value "SharedArrayBuffer" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
25.2.6 Properties of SharedArrayBuffer Instances
SharedArrayBuffer instances inherit properties from the SharedArrayBuffer
prototype object . SharedArrayBuffer instances each have an [[ArrayBufferData]] internal slot. SharedArrayBuffer instances which are
not growable each have an [[ArrayBufferByteLength]] internal slot.
SharedArrayBuffer instances which are growable each have an [[ArrayBufferByteLengthData]] internal slot and an [[ArrayBufferMaxByteLength]] internal slot.
Note
SharedArrayBuffer instances, unlike ArrayBuffer instances, are never detached.
25.2.7 Growable SharedArrayBuffer Guidelines
Note 1
The following are guidelines for ECMAScript programmers working with growable
SharedArrayBuffer .
We recommend that programs be tested in their deployment environments where possible. The
amount of available physical memory differ greatly between hardware devices. Similarly,
virtual memory subsystems also differ greatly between hardware devices as well as
operating systems. An application that runs without out-of-memory errors on a 64-bit
desktop web browser could run out of memory on a 32-bit mobile web browser.
When choosing a value for the "maxByteLength" option for growable
SharedArrayBuffer , we recommend that the smallest possible size
for the application be chosen. We recommend that "maxByteLength" does
not exceed 1073741824, or 1GiB.
Please note that successfully constructing a growable
SharedArrayBuffer for a particular maximum size does not
guarantee that future grows will succeed.
Not all loads of a growable
SharedArrayBuffer 's length are synchronizing
seq-cst loads. Loads of the length that are for bounds-checking
of an integer-indexed property access, e.g.
u8[idx], are not synchronizing. In general, in the absence of explicit
synchronization, one property access being in-bound does not imply a subsequent property
access in the same agent is also in-bound. In contrast, explicit loads
of the length via the length and byteLength getters on
SharedArrayBuffer, %TypedArray% .prototype,
and DataView.prototype are synchronizing. Loads of the length that are performed by
built-in methods to check if a TypedArray is entirely out-of-bounds are also
synchronizing.
Note 2
The following are guidelines for ECMAScript implementers implementing growable
SharedArrayBuffer .
We recommend growable
SharedArrayBuffer be implemented as in-place growth via reserving
virtual memory up front.
Because grow operations can happen in parallel with memory accesses on a growable
SharedArrayBuffer , the constraints of the memory
model require that even unordered accesses do not "tear" (bits of
their values will not be mixed). In practice, this means the underlying data block of a
growable
SharedArrayBuffer cannot be grown by being copied without
stopping the world. We do not recommend stopping the world as an implementation strategy
because it introduces a serialization point and is slow.
Grown memory must appear zeroed from the moment of its creation, including to any racy
accesses in parallel. This can be accomplished via zero-filled-on-demand virtual memory
pages, or careful synchronization if manually zeroing memory.
Integer-indexed property access on
TypedArray views of growable
SharedArrayBuffers is intended to be optimizable similarly to access on TypedArray
views of non-growable SharedArrayBuffers, because integer-indexed property
loads on are not synchronizing on the underlying buffer's length (see programmer
guidelines above). For example, bounds checks for property accesses may still be hoisted
out of loops.
In practice it is difficult to implement growable
SharedArrayBuffer by copying on hosts that do not have virtual
memory, such as those running on embedded devices without an MMU. Memory usage behaviour
of growable SharedArrayBuffers on such hosts may significantly differ from that of
hosts with virtual
memory. Such hosts
should clearly communicate memory usage expectations to users.
25.3 DataView Objects
25.3.1 Abstract Operations For DataView Objects
25.3.1.1 DataView With Buffer Witness Records
A DataView With Buffer
Witness Record is a Record
value used to encapsulate a DataView along with a cached byte length of the viewed buffer.
It is used to help ensure there is a single shared memory read event of the byte length data
block when the viewed buffer is a growable SharedArrayBuffers.
DataView With Buffer Witness Records have the fields listed in Table 77 .
Table 77: DataView
With Buffer Witness Record Fields
Field Name
Value
Meaning
[[Object]]
a DataView
The DataView object whose buffer's byte length is loaded.
[[CachedBufferByteLength]]
a non-negative integer or
detached
The byte length of the object's [[ViewedArrayBuffer]] when the Record
was created.
25.3.1.2 MakeDataViewWithBufferWitnessRecord ( obj ,
order )
The abstract operation MakeDataViewWithBufferWitnessRecord takes arguments obj (a
DataView) and order (seq-cst or
unordered ) and returns a DataView With Buffer Witness
Record . It performs the following steps when called:
Let buffer be obj .[[ViewedArrayBuffer]] .
If IsDetachedBuffer (buffer )
is true , then
Let byteLength be detached .
Else,
Let byteLength be ArrayBufferByteLength (buffer ,
order ).
Return the DataView
With Buffer Witness Record { [[Object]] : obj , [[CachedBufferByteLength]] : byteLength }.
25.3.1.3 GetViewByteLength ( viewRecord )
The abstract operation GetViewByteLength takes argument viewRecord (a DataView With Buffer Witness
Record ) and returns a non-negative integer . It performs the following
steps when called:
Assert :
IsViewOutOfBounds (viewRecord )
is false .
Let view be viewRecord .[[Object]] .
If view .[[ByteLength]] is not
auto , return view .[[ByteLength]] .
Assert :
IsFixedLengthArrayBuffer (view .[[ViewedArrayBuffer]] ) is false .
Let byteOffset be view .[[ByteOffset]] .
Let byteLength be viewRecord .[[CachedBufferByteLength]] .
Assert :
byteLength is not detached .
Return byteLength - byteOffset .
25.3.1.4 IsViewOutOfBounds ( viewRecord )
The abstract operation IsViewOutOfBounds takes argument viewRecord (a DataView With Buffer Witness
Record ) and returns a Boolean. It performs the following steps when
called:
Let view be viewRecord .[[Object]] .
Let bufferByteLength be viewRecord .[[CachedBufferByteLength]] .
Assert :
IsDetachedBuffer (view .[[ViewedArrayBuffer]] ) is true if and
only if bufferByteLength is detached .
If bufferByteLength is detached , return
true .
Let byteOffsetStart be view .[[ByteOffset]] .
If view .[[ByteLength]] is
auto , then
Let byteOffsetEnd be bufferByteLength .
Else,
Let byteOffsetEnd be byteOffsetStart +
view .[[ByteLength]] .
If byteOffsetStart > bufferByteLength or
byteOffsetEnd > bufferByteLength , return
true .
NOTE: 0-length DataViews are not considered out-of-bounds.
Return false .
25.3.1.5 GetViewValue ( view ,
requestIndex , isLittleEndian , type )
The abstract operation GetViewValue takes arguments view (an ECMAScript language value ),
requestIndex (an ECMAScript language
value ), isLittleEndian (an ECMAScript language value ), and
type (a TypedArray element type ) and returns
either a normal completion
containing either a Number or a BigInt, or a throw completion . It
is used by functions on DataView instances to retrieve values from the view's buffer. It
performs the following steps when called:
Perform ? RequireInternalSlot (view ,
[[DataView]] ).
Assert :
view has a [[ViewedArrayBuffer]] internal slot.
Let getIndex be ? ToIndex (requestIndex ).
Set isLittleEndian to ToBoolean (isLittleEndian ).
Let viewOffset be view .[[ByteOffset]] .
Let viewRecord be MakeDataViewWithBufferWitnessRecord (view ,
unordered ).
NOTE: Bounds checking is not a synchronizing operation when view 's
backing buffer is a growable
SharedArrayBuffer .
If IsViewOutOfBounds (viewRecord )
is true , throw a TypeError exception.
Let viewSize be GetViewByteLength (viewRecord ).
Let elementSize be the Element Size value specified in Table 75 for
Element Type type .
If getIndex + elementSize > viewSize , throw a
RangeError exception.
Let bufferIndex be getIndex + viewOffset .
Return GetValueFromBuffer (view .[[ViewedArrayBuffer]] , bufferIndex ,
type , false , unordered ,
isLittleEndian ).
25.3.1.6 SetViewValue ( view ,
requestIndex , isLittleEndian , type , value )
The abstract operation SetViewValue takes arguments view (an ECMAScript language value ),
requestIndex (an ECMAScript language
value ), isLittleEndian (an ECMAScript language value ),
type (a TypedArray element type ), and
value (an ECMAScript language value ) and
returns either a normal completion
containing undefined or a throw completion . It
is used by functions on DataView instances to store values into the view's buffer. It
performs the following steps when called:
Perform ? RequireInternalSlot (view ,
[[DataView]] ).
Assert :
view has a [[ViewedArrayBuffer]] internal slot.
Let getIndex be ? ToIndex (requestIndex ).
If IsBigIntElementType (type )
is true , let numberValue be ? ToBigInt (value ).
Otherwise, let numberValue be ? ToNumber (value ).
Set isLittleEndian to ToBoolean (isLittleEndian ).
Let viewOffset be view .[[ByteOffset]] .
Let viewRecord be MakeDataViewWithBufferWitnessRecord (view ,
unordered ).
NOTE: Bounds checking is not a synchronizing operation when view 's
backing buffer is a growable
SharedArrayBuffer .
If IsViewOutOfBounds (viewRecord )
is true , throw a TypeError exception.
Let viewSize be GetViewByteLength (viewRecord ).
Let elementSize be the Element Size value specified in Table 75 for
Element Type type .
If getIndex + elementSize > viewSize , throw a
RangeError exception.
Let bufferIndex be getIndex + viewOffset .
Perform SetValueInBuffer (view .[[ViewedArrayBuffer]] , bufferIndex ,
type , numberValue , false ,
unordered , isLittleEndian ).
Return undefined .
25.3.2 The DataView Constructor
The DataView constructor :
is %DataView% .
is the initial value of the "DataView" property of the global
object .
creates and initializes a new DataView when called as a constructor .
is not intended to be called as a function and will throw an exception when called in that
manner.
may be used as the value of an extends clause of a class definition. Subclass
constructors that intend to inherit the specified
DataView behaviour must include a super call to the DataView constructor to
create and initialize subclass instances with the internal state necessary to support the
DataView.prototype built-in methods.
25.3.2.1 DataView ( buffer [ , byteOffset
[ , byteLength ] ] )
This function performs the following steps when called:
If NewTarget is undefined , throw a TypeError
exception.
Perform ? RequireInternalSlot (buffer ,
[[ArrayBufferData]] ).
Let offset be ? ToIndex (byteOffset ).
If IsDetachedBuffer (buffer )
is true , throw a TypeError exception.
Let bufferByteLength be ArrayBufferByteLength (buffer ,
seq-cst ).
If offset > bufferByteLength , throw a
RangeError exception.
Let bufferIsFixedLength be IsFixedLengthArrayBuffer (buffer ).
If byteLength is undefined , then
If bufferIsFixedLength is true , then
Let viewByteLength be bufferByteLength -
offset .
Else,
Let viewByteLength be auto .
Else,
Let viewByteLength be ? ToIndex (byteLength ).
If offset + viewByteLength >
bufferByteLength , throw a RangeError
exception.
Let O be ? OrdinaryCreateFromConstructor (NewTarget,
"%DataView.prototype%" , « [[DataView]] ,
[[ViewedArrayBuffer]] , [[ByteLength]] , [[ByteOffset]] »).
If IsDetachedBuffer (buffer )
is true , throw a TypeError exception.
Set bufferByteLength to ArrayBufferByteLength (buffer ,
seq-cst ).
If offset > bufferByteLength , throw a
RangeError exception.
If byteLength is not undefined , then
If offset + viewByteLength >
bufferByteLength , throw a RangeError
exception.
Set O .[[ViewedArrayBuffer]] to
buffer .
Set O .[[ByteLength]] to
viewByteLength .
Set O .[[ByteOffset]] to offset .
Return O .
25.3.3 Properties of the DataView Constructor
The DataView constructor :
has a [[Prototype]] internal slot whose value is %Function.prototype% .
has the following properties:
25.3.3.1 DataView.prototype
The initial value of DataView.prototype is the DataView prototype
object .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }.
25.3.4 Properties of the DataView Prototype Object
The DataView prototype object :
is %DataView.prototype% .
has a [[Prototype]] internal slot whose value is %Object.prototype% .
is an ordinary
object .
does not have a [[DataView]] , [[ViewedArrayBuffer]] , [[ByteLength]] , or
[[ByteOffset]] internal slot.
25.3.4.1 get DataView.prototype.buffer
DataView.prototype.buffer is an accessor property whose set
accessor function is undefined . Its get accessor function performs the
following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[DataView]] ).
Assert :
O has a [[ViewedArrayBuffer]] internal slot.
Let buffer be O .[[ViewedArrayBuffer]] .
Return buffer .
25.3.4.2 get DataView.prototype.byteLength
DataView.prototype.byteLength is an accessor property whose set
accessor function is undefined . Its get accessor function performs the
following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[DataView]] ).
Assert :
O has a [[ViewedArrayBuffer]] internal slot.
Let viewRecord be MakeDataViewWithBufferWitnessRecord (O ,
seq-cst ).
If IsViewOutOfBounds (viewRecord )
is true , throw a TypeError exception.
Let size be GetViewByteLength (viewRecord ).
Return 𝔽 (size ).
25.3.4.3 get DataView.prototype.byteOffset
DataView.prototype.byteOffset is an accessor property whose set
accessor function is undefined . Its get accessor function performs the
following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[DataView]] ).
Assert :
O has a [[ViewedArrayBuffer]] internal slot.
Let viewRecord be MakeDataViewWithBufferWitnessRecord (O ,
seq-cst ).
If IsViewOutOfBounds (viewRecord )
is true , throw a TypeError exception.
Let offset be O .[[ByteOffset]] .
Return 𝔽 (offset ).
25.3.4.4 DataView.prototype.constructor
The initial value of DataView.prototype.constructor is %DataView% .
25.3.4.5 DataView.prototype.getBigInt64 ( byteOffset
[ , littleEndian ] )
This method performs the following steps when called:
Let view be the this value.
Return ? GetViewValue (view ,
byteOffset , littleEndian , bigint64 ).
25.3.4.6 DataView.prototype.getBigUint64 ( byteOffset
[ , littleEndian ] )
This method performs the following steps when called:
Let view be the this value.
Return ? GetViewValue (view ,
byteOffset , littleEndian , biguint64 ).
25.3.4.7 DataView.prototype.getFloat16 ( byteOffset [
, littleEndian ] )
This method performs the following steps when called:
Let view be the this value.
If littleEndian is not present, set littleEndian to
false .
Return ? GetViewValue (view ,
byteOffset , littleEndian , float16 ).
25.3.4.8 DataView.prototype.getFloat32 ( byteOffset [
, littleEndian ] )
This method performs the following steps when called:
Let view be the this value.
If littleEndian is not present, set littleEndian to
false .
Return ? GetViewValue (view ,
byteOffset , littleEndian , float32 ).
25.3.4.9 DataView.prototype.getFloat64 ( byteOffset [
, littleEndian ] )
This method performs the following steps when called:
Let view be the this value.
If littleEndian is not present, set littleEndian to
false .
Return ? GetViewValue (view ,
byteOffset , littleEndian , float64 ).
25.3.4.10 DataView.prototype.getInt8 ( byteOffset )
This method performs the following steps when called:
Let view be the this value.
Return ? GetViewValue (view ,
byteOffset , true , int8 ).
25.3.4.11 DataView.prototype.getInt16 ( byteOffset [
, littleEndian ] )
This method performs the following steps when called:
Let view be the this value.
If littleEndian is not present, set littleEndian to
false .
Return ? GetViewValue (view ,
byteOffset , littleEndian , int16 ).
25.3.4.12 DataView.prototype.getInt32 ( byteOffset [
, littleEndian ] )
This method performs the following steps when called:
Let view be the this value.
If littleEndian is not present, set littleEndian to
false .
Return ? GetViewValue (view ,
byteOffset , littleEndian , int32 ).
25.3.4.13 DataView.prototype.getUint8 ( byteOffset )
This method performs the following steps when called:
Let view be the this value.
Return ? GetViewValue (view ,
byteOffset , true , uint8 ).
25.3.4.14 DataView.prototype.getUint16 ( byteOffset [
, littleEndian ] )
This method performs the following steps when called:
Let view be the this value.
If littleEndian is not present, set littleEndian to
false .
Return ? GetViewValue (view ,
byteOffset , littleEndian , uint16 ).
25.3.4.15 DataView.prototype.getUint32 ( byteOffset [
, littleEndian ] )
This method performs the following steps when called:
Let view be the this value.
If littleEndian is not present, set littleEndian to
false .
Return ? GetViewValue (view ,
byteOffset , littleEndian , uint32 ).
25.3.4.16 DataView.prototype.setBigInt64 (
byteOffset , value [ , littleEndian ] )
This method performs the following steps when called:
Let view be the this value.
Return ? SetViewValue (view ,
byteOffset , littleEndian , bigint64 ,
value ).
25.3.4.17 DataView.prototype.setBigUint64 (
byteOffset , value [ , littleEndian ] )
This method performs the following steps when called:
Let view be the this value.
Return ? SetViewValue (view ,
byteOffset , littleEndian , biguint64 ,
value ).
25.3.4.18 DataView.prototype.setFloat16 ( byteOffset ,
value [ , littleEndian ] )
This method performs the following steps when called:
Let view be the this value.
If littleEndian is not present, set littleEndian to
false .
Return ? SetViewValue (view ,
byteOffset , littleEndian , float16 ,
value ).
25.3.4.19 DataView.prototype.setFloat32 ( byteOffset ,
value [ , littleEndian ] )
This method performs the following steps when called:
Let view be the this value.
If littleEndian is not present, set littleEndian to
false .
Return ? SetViewValue (view ,
byteOffset , littleEndian , float32 ,
value ).
25.3.4.20 DataView.prototype.setFloat64 ( byteOffset ,
value [ , littleEndian ] )
This method performs the following steps when called:
Let view be the this value.
If littleEndian is not present, set littleEndian to
false .
Return ? SetViewValue (view ,
byteOffset , littleEndian , float64 ,
value ).
25.3.4.21 DataView.prototype.setInt8 ( byteOffset ,
value )
This method performs the following steps when called:
Let view be the this value.
Return ? SetViewValue (view ,
byteOffset , true , int8 ,
value ).
25.3.4.22 DataView.prototype.setInt16 ( byteOffset ,
value [ , littleEndian ] )
This method performs the following steps when called:
Let view be the this value.
If littleEndian is not present, set littleEndian to
false .
Return ? SetViewValue (view ,
byteOffset , littleEndian , int16 ,
value ).
25.3.4.23 DataView.prototype.setInt32 ( byteOffset ,
value [ , littleEndian ] )
This method performs the following steps when called:
Let view be the this value.
If littleEndian is not present, set littleEndian to
false .
Return ? SetViewValue (view ,
byteOffset , littleEndian , int32 ,
value ).
25.3.4.24 DataView.prototype.setUint8 ( byteOffset ,
value )
This method performs the following steps when called:
Let view be the this value.
Return ? SetViewValue (view ,
byteOffset , true , uint8 ,
value ).
25.3.4.25 DataView.prototype.setUint16 ( byteOffset ,
value [ , littleEndian ] )
This method performs the following steps when called:
Let view be the this value.
If littleEndian is not present, set littleEndian to
false .
Return ? SetViewValue (view ,
byteOffset , littleEndian , uint16 ,
value ).
25.3.4.26 DataView.prototype.setUint32 ( byteOffset ,
value [ , littleEndian ] )
This method performs the following steps when called:
Let view be the this value.
If littleEndian is not present, set littleEndian to
false .
Return ? SetViewValue (view ,
byteOffset , littleEndian , uint32 ,
value ).
25.3.4.27 DataView.prototype [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is the
String value "DataView" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
25.3.5 Properties of DataView Instances
DataView instances are ordinary objects that inherit properties from the
DataView prototype
object . DataView instances each have [[DataView]] , [[ViewedArrayBuffer]] , [[ByteLength]] , and [[ByteOffset]] internal
slots.
Note
The value of the [[DataView]] internal slot is not used within
this specification. The simple presence of that internal slot is used within the
specification to identify objects created using the DataView constructor .
25.4 The Atomics Object
The Atomics object:
is %Atomics% .
is the initial value of the "Atomics" property of the global
object .
is an ordinary
object .
has a [[Prototype]] internal slot whose value is %Object.prototype% .
does not have a [[Construct]] internal method; it cannot be used as a
constructor
with the new operator.
does not have a [[Call]] internal method; it cannot be invoked as a
function.
The Atomics object provides functions that operate indivisibly (atomically) on shared memory array
cells as well as functions that let agents wait for and dispatch primitive events. When used with
discipline, the Atomics functions allow multi-agent programs that communicate through shared memory to
execute in a well-understood order even on parallel CPUs. The rules that govern shared-memory
communication are provided by the memory model , defined below.
Note
For informative guidelines for programming and implementing shared memory in ECMAScript,
please see the notes at the end of the memory model section.
25.4.1 Waiter Record
A Waiter Record is a Record value used to
denote a particular call to Atomics.wait or Atomics.waitAsync.
A Waiter Record has fields listed in Table 78 .
Table 78: Waiter Record Fields
Field Name
Value
Meaning
[[AgentSignifier]]
an agent
signifier
The agent that called
Atomics.wait or Atomics.waitAsync.
[[PromiseCapability]]
a PromiseCapability
Record or blocking
If denoting a call to Atomics.waitAsync, the resulting promise,
otherwise blocking .
[[TimeoutTime]]
a non-negative extended
mathematical value
The earliest time by which timeout may be triggered; computed using
time values .
[[Result]]
"ok" or "timed-out"
The return value of the call.
25.4.2 WaiterList Records
A WaiterList Record is used to explain
waiting and notification of agents via Atomics.wait,
Atomics.waitAsync, and Atomics.notify.
A WaiterList Record has fields listed in Table 79 .
Table 79: WaiterList Record Fields
Field Name
Value
Meaning
[[Waiters]]
a List
of Waiter Records
The calls to Atomics.wait or Atomics.waitAsync
that are waiting on the location with which this WaiterList is associated.
[[MostRecentLeaveEvent]]
a Synchronize
event or empty
The event of the most recent leaving of its critical section , or
empty if its critical
section has never been entered.
There can be multiple Waiter Records in a WaiterList with the same
agent
signifier .
The agent
cluster has a store of WaiterList Records; the store is indexed by
(block , i ), where block is a Shared Data Block and i
a byte offset into the memory of block . WaiterList Records are agent -independent: a lookup in
the store of WaiterList Records by (block , i ) will result in the same
WaiterList Record in any agent in the agent cluster .
Each WaiterList Record has a critical
section that controls exclusive access to that WaiterList Record during evaluation.
Only a single agent may
enter a WaiterList Record's critical section at one time. Entering and leaving a WaiterList
Record's critical section is controlled by the abstract operations
EnterCriticalSection and LeaveCriticalSection . Operations on a
WaiterList Record—adding and removing waiting agents , traversing the list of agents , suspending and notifying agents on the list, setting
and retrieving the Synchronize event —may only be
performed by agents that
have entered the WaiterList Record's critical section.
25.4.3 Abstract Operations for Atomics
25.4.3.1 ValidateIntegerTypedArray ( typedArray ,
waitable )
The abstract operation ValidateIntegerTypedArray takes arguments typedArray (an
ECMAScript language value ) and
waitable (a Boolean) and returns either a normal completion
containing a TypedArray With Buffer Witness
Record , or a throw completion . It
performs the following steps when called:
Let taRecord be ? ValidateTypedArray (typedArray ,
unordered ).
NOTE: Bounds checking is not a synchronizing operation when typedArray 's
backing buffer is a growable
SharedArrayBuffer .
If waitable is true , then
If typedArray .[[TypedArrayName]] is
neither "Int32Array" nor
"BigInt64Array" , throw a TypeError
exception.
Else,
Let type be TypedArrayElementType (typedArray ).
If IsUnclampedIntegerElementType (type )
is false and IsBigIntElementType (type )
is false , throw a TypeError exception.
Return taRecord .
25.4.3.2 ValidateAtomicAccess ( taRecord ,
requestIndex )
The abstract operation ValidateAtomicAccess takes arguments taRecord (a TypedArray With Buffer Witness
Record ) and requestIndex (an ECMAScript language value ) and
returns either a normal completion
containing an integer or a throw completion . It
performs the following steps when called:
Let length be TypedArrayLength (taRecord ).
Let accessIndex be ? ToIndex (requestIndex ).
Assert :
accessIndex ≥ 0.
If accessIndex ≥ length , throw a RangeError
exception.
Let typedArray be taRecord .[[Object]] .
Let elementSize be TypedArrayElementSize (typedArray ).
Let offset be typedArray .[[ByteOffset]] .
Return (accessIndex × elementSize ) + offset .
25.4.3.3 ValidateAtomicAccessOnIntegerTypedArray (
typedArray , requestIndex )
The abstract operation ValidateAtomicAccessOnIntegerTypedArray takes arguments
typedArray (an ECMAScript language value ) and
requestIndex (an ECMAScript language
value ) and returns either a normal completion
containing an integer or a throw completion . It
performs the following steps when called:
Let taRecord be ? ValidateIntegerTypedArray (typedArray ,
false ).
Return ? ValidateAtomicAccess (taRecord ,
requestIndex ).
25.4.3.4 RevalidateAtomicAccess ( typedArray ,
byteIndexInBuffer )
The abstract operation RevalidateAtomicAccess takes arguments typedArray (a
TypedArray ) and byteIndexInBuffer (an
integer ) and
returns either a normal completion
containing unused or a throw completion .
This operation revalidates the index within the backing buffer for atomic operations after
all argument coercions are performed in Atomics methods, as argument coercions can have
arbitrary side effects, which could cause the buffer to become out of bounds. This operation
does not throw when typedArray 's backing buffer is a SharedArrayBuffer. It
performs the following steps when called:
Let taRecord be MakeTypedArrayWithBufferWitnessRecord (typedArray ,
unordered ).
NOTE: Bounds checking is not a synchronizing operation when typedArray 's
backing buffer is a growable
SharedArrayBuffer .
If IsTypedArrayOutOfBounds (taRecord )
is true , throw a TypeError exception.
Assert :
byteIndexInBuffer ≥ typedArray .[[ByteOffset]] .
If byteIndexInBuffer ≥ taRecord .[[CachedBufferByteLength]] , throw a
RangeError exception.
Return unused .
25.4.3.5 GetWaiterList ( block , i )
The abstract operation GetWaiterList takes arguments block (a Shared Data
Block ) and i (a non-negative integer that is evenly divisible by 4)
and returns a WaiterList Record . It performs the
following steps when called:
Assert :
i and i + 3 are valid byte offsets within the memory of
block .
Return the WaiterList Record that is
referenced by the pair (block , i ).
25.4.3.6 EnterCriticalSection ( WL )
The abstract operation EnterCriticalSection takes argument WL (a WaiterList Record ) and returns
unused . It performs the following steps when called:
Assert :
The surrounding agent is not in the
critical section for any
WaiterList Record .
Wait until no agent is in the critical section for
WL , then enter the critical
section for WL (without allowing any other
agent to
enter).
If WL .[[MostRecentLeaveEvent]] is not
empty , then
NOTE: A WL whose critical
section has been entered at least once has a
Synchronize
event set by LeaveCriticalSection .
Let execution be the [[CandidateExecution]] field of the surrounding agent 's
Agent
Record .
Let eventsRecord be the Agent Events
Record of execution .[[EventsRecords]] whose [[AgentSignifier]] is AgentSignifier ().
Let enterEvent be a new Synchronize
event .
Append enterEvent to eventsRecord .[[EventList]] .
Append (WL .[[MostRecentLeaveEvent]] ,
enterEvent ) to eventsRecord .[[AgentSynchronizesWith]] .
Return unused .
EnterCriticalSection has contention when an agent attempting to enter the critical section must wait for another
agent to leave it.
When there is no contention, FIFO order of EnterCriticalSection calls is observable. When
there is contention, an implementation may choose an arbitrary order but may not cause an
agent to wait
indefinitely.
25.4.3.7 LeaveCriticalSection ( WL )
The abstract operation LeaveCriticalSection takes argument WL (a WaiterList Record ) and returns
unused . It performs the following steps when called:
Assert :
The surrounding agent is in the
critical section for
WL .
Let execution be the [[CandidateExecution]]
field of the surrounding agent 's Agent
Record .
Let eventsRecord be the Agent Events
Record of execution .[[EventsRecords]] whose [[AgentSignifier]] is AgentSignifier ().
Let leaveEvent be a new Synchronize
event .
Append leaveEvent to eventsRecord .[[EventList]] .
Set WL .[[MostRecentLeaveEvent]] to
leaveEvent .
Leave the critical section for
WL .
Return unused .
25.4.3.8 AddWaiter ( WL , waiterRecord )
The abstract operation AddWaiter takes arguments WL (a WaiterList Record ) and
waiterRecord (a Waiter Record ) and returns
unused . It performs the following steps when called:
Assert :
The surrounding agent is in the
critical section for
WL .
Assert :
There is no Waiter Record in WL .[[Waiters]] whose [[PromiseCapability]] field is waiterRecord .[[PromiseCapability]] and whose [[AgentSignifier]] field is waiterRecord .[[AgentSignifier]] .
Append waiterRecord to WL .[[Waiters]] .
Return unused .
25.4.3.9 RemoveWaiter ( WL , waiterRecord )
The abstract operation RemoveWaiter takes arguments WL (a WaiterList Record ) and
waiterRecord (a Waiter Record ) and returns
unused . It performs the following steps when called:
Assert :
The surrounding agent is in the
critical section for
WL .
Assert :
WL .[[Waiters]] contains waiterRecord .
Remove waiterRecord from WL .[[Waiters]] .
Return unused .
25.4.3.10 RemoveWaiters ( WL , c )
The abstract operation RemoveWaiters takes arguments WL (a WaiterList Record ) and c (a
non-negative integer or +∞) and returns a List of Waiter
Records . It performs the following steps when called:
Assert :
The surrounding agent is in the
critical section for
WL .
Let len be the number of elements in WL .[[Waiters]] .
Let n be min (c , len ).
Let L be a List whose
elements are the first n elements of WL .[[Waiters]] .
Remove the first n elements of WL .[[Waiters]] .
Return L .
25.4.3.11 SuspendThisAgent ( WL ,
waiterRecord )
The abstract operation SuspendThisAgent takes arguments WL (a WaiterList Record ) and
waiterRecord (a Waiter Record ) and returns
unused . It performs the following steps when called:
Assert :
The surrounding agent is in the
critical section for
WL .
Assert :
WL .[[Waiters]] contains waiterRecord .
Let thisAgent be AgentSignifier ().
Assert :
waiterRecord .[[AgentSignifier]] is
thisAgent .
Assert :
waiterRecord .[[PromiseCapability]] is
blocking .
Assert :
AgentCanSuspend () is
true .
Perform LeaveCriticalSection (WL )
and suspend the surrounding agent until the time is
waiterRecord .[[TimeoutTime]] , performing the
combined operation in such a way that a notification that arrives after the
critical section is exited but
before the suspension takes effect is not lost. The surrounding agent can only wake
from suspension due to a timeout or due to another agent calling NotifyWaiter with arguments
WL and thisAgent (i.e. via a call to
Atomics.notify).
Perform EnterCriticalSection (WL ).
Return unused .
25.4.3.12 NotifyWaiter ( WL , waiterRecord
)
The abstract operation NotifyWaiter takes arguments WL (a WaiterList Record ) and
waiterRecord (a Waiter Record ) and returns
unused . It performs the following steps when called:
Assert :
The surrounding agent is in the
critical section for
WL .
If waiterRecord .[[PromiseCapability]] is
blocking , then
Wake the agent whose signifier is
waiterRecord .[[AgentSignifier]] from
suspension.
NOTE: This causes the agent to resume execution in SuspendThisAgent .
Else if AgentSignifier () is
waiterRecord .[[AgentSignifier]] , then
Let promiseCapability be waiterRecord .[[PromiseCapability]] .
Perform ! Call (promiseCapability .[[Resolve]] , undefined , «
waiterRecord .[[Result]] »).
Else,
Perform EnqueueResolveInAgentJob (waiterRecord .[[AgentSignifier]] , waiterRecord .[[PromiseCapability]] , waiterRecord .[[Result]] ).
Return unused .
Note
An agent must
not access another agent 's promise capability in any capacity
beyond passing it to the host .
25.4.3.13 EnqueueResolveInAgentJob ( agentSignifier ,
promiseCapability , resolution )
The abstract operation EnqueueResolveInAgentJob takes arguments agentSignifier (an
agent
signifier ), promiseCapability (a PromiseCapability Record ), and
resolution ("ok" or "timed-out" ) and
returns unused . It performs the following steps when called:
Let resolveJob be a new Job Abstract Closure
with no parameters that captures agentSignifier ,
promiseCapability , and resolution and performs the following
steps when called:
Assert : AgentSignifier () is
agentSignifier .
Perform ! Call (promiseCapability .[[Resolve]] , undefined , «
resolution »).
Return unused .
Let realmInTargetAgent be ! GetFunctionRealm (promiseCapability .[[Resolve]] ).
Assert :
agentSignifier is realmInTargetAgent .[[AgentSignifier]] .
Perform HostEnqueueGenericJob (resolveJob ,
realmInTargetAgent ).
Return unused .
25.4.3.14 DoWait ( mode , typedArray ,
index , value , timeout )
The abstract operation DoWait takes arguments mode (sync or
async ), typedArray (an ECMAScript language value ),
index (an ECMAScript language value ),
value (an ECMAScript language value ), and
timeout (an ECMAScript language value ) and
returns either a normal completion
containing either an Object, "not-equal" ,
"timed-out" , or "ok" , or a throw completion . It
performs the following steps when called:
Let taRecord be ? ValidateIntegerTypedArray (typedArray ,
true ).
Let buffer be taRecord .[[Object]] .[[ViewedArrayBuffer]] .
If IsSharedArrayBuffer (buffer )
is false , throw a TypeError exception.
Let i be ? ValidateAtomicAccess (taRecord ,
index ).
Let arrayTypeName be typedArray .[[TypedArrayName]] .
If arrayTypeName is "BigInt64Array" , let v
be ? ToBigInt64 (value ).
Else, let v be ? ToInt32 (value ).
Let q be ? ToNumber (timeout ).
If q is either NaN or
+∞ 𝔽 , let t be +∞; else if q is
-∞ 𝔽 , let t be 0; else let t be
max (ℝ (q ), 0).
If mode is sync and AgentCanSuspend () is
false , throw a TypeError exception.
Let block be buffer .[[ArrayBufferData]] .
Let offset be typedArray .[[ByteOffset]] .
Let byteIndexInBuffer be (i × 4) + offset .
Let WL be GetWaiterList (block ,
byteIndexInBuffer ).
If mode is sync , then
Let promiseCapability be blocking .
Let resultObject be undefined .
Else,
Let promiseCapability be ! NewPromiseCapability (%Promise% ).
Let resultObject be OrdinaryObjectCreate (%Object.prototype% ).
Perform EnterCriticalSection (WL ).
Let elementType be TypedArrayElementType (typedArray ).
Let w be GetValueFromBuffer (buffer ,
byteIndexInBuffer , elementType , true ,
seq-cst ).
If v ≠ w , then
Perform LeaveCriticalSection (WL ).
If mode is sync , return
"not-equal" .
Perform ! CreateDataPropertyOrThrow (resultObject ,
"async" , false ).
Perform ! CreateDataPropertyOrThrow (resultObject ,
"value" , "not-equal" ).
Return resultObject .
If t = 0 and mode is async , then
NOTE: There is no special handling of synchronous immediate timeouts.
Asynchronous immediate timeouts have special handling in order to fail fast
and avoid unnecessary Promise jobs.
Perform LeaveCriticalSection (WL ).
Perform ! CreateDataPropertyOrThrow (resultObject ,
"async" , false ).
Perform ! CreateDataPropertyOrThrow (resultObject ,
"value" , "timed-out" ).
Return resultObject .
Let thisAgent be AgentSignifier ().
Let now be the time
value (UTC) identifying the current time.
Let additionalTimeout be an implementation-defined
non-negative mathematical value .
Let timeoutTime be ℝ (now ) + t +
additionalTimeout .
NOTE: When t is +∞, timeoutTime is also +∞.
Let waiterRecord be a new Waiter Record { [[AgentSignifier]] : thisAgent , [[PromiseCapability]] : promiseCapability , [[TimeoutTime]] : timeoutTime , [[Result]] : "ok" }.
Perform AddWaiter (WL ,
waiterRecord ).
If mode is sync , then
Perform SuspendThisAgent (WL ,
waiterRecord ).
Else if timeoutTime is finite , then
Perform EnqueueAtomicsWaitAsyncTimeoutJob (WL ,
waiterRecord ).
Perform LeaveCriticalSection (WL ).
If mode is sync , return
waiterRecord .[[Result]] .
Perform ! CreateDataPropertyOrThrow (resultObject ,
"async" , true ).
Perform ! CreateDataPropertyOrThrow (resultObject ,
"value" , promiseCapability .[[Promise]] ).
Return resultObject .
Note
additionalTimeout allows implementations to pad timeouts as necessary,
such as for reducing power consumption or coarsening timer resolution to mitigate
timing attacks. This value may differ from call to call of DoWait.
25.4.3.15 EnqueueAtomicsWaitAsyncTimeoutJob ( WL ,
waiterRecord )
The abstract operation EnqueueAtomicsWaitAsyncTimeoutJob takes arguments WL (a
WaiterList Record ) and
waiterRecord (a Waiter Record ) and returns
unused . It performs the following steps when called:
Let timeoutJob be a new Job Abstract Closure
with no parameters that captures WL and waiterRecord and
performs the following steps when called:
Perform EnterCriticalSection (WL ).
If WL .[[Waiters]] contains
waiterRecord , then
Let timeOfJobExecution be the time
value (UTC) identifying the current time.
Assert : ℝ (timeOfJobExecution ) ≥
waiterRecord .[[TimeoutTime]]
(ignoring potential non-monotonicity of time
values ).
Set waiterRecord .[[Result]] to
"timed-out" .
Perform RemoveWaiter (WL ,
waiterRecord ).
Perform NotifyWaiter (WL ,
waiterRecord ).
Perform LeaveCriticalSection (WL ).
Return unused .
Let now be the time
value (UTC) identifying the current time.
Let currentRealm be the current Realm Record .
Perform HostEnqueueTimeoutJob (timeoutJob ,
currentRealm , 𝔽 (waiterRecord .[[TimeoutTime]] ) - now ).
Return unused .
25.4.3.16 AtomicCompareExchangeInSharedBlock ( block ,
byteIndexInBuffer , elementSize , expectedBytes ,
replacementBytes )
The abstract operation AtomicCompareExchangeInSharedBlock takes arguments block (a
Shared Data
Block ), byteIndexInBuffer (an integer ), elementSize (a
non-negative integer ), expectedBytes (a List of byte
values ), and replacementBytes (a List of byte
values ) and returns a List of byte
values . It performs the following steps when called:
Let execution be the [[CandidateExecution]]
field of the surrounding agent 's Agent
Record .
Let eventsRecord be the Agent Events
Record of execution .[[EventsRecords]] whose [[AgentSignifier]] is AgentSignifier ().
Let rawBytesRead be a List of length
elementSize whose elements are nondeterministically chosen byte
values .
NOTE: In implementations, rawBytesRead is the result of a load-link, of a
load-exclusive, or of an operand of a read-modify-write instruction on the
underlying hardware. The nondeterminism is a semantic prescription of the memory
model to describe observable behaviour of hardware with weak
consistency.
NOTE: The comparison of the expected value and the read value is performed outside
of the read-modify-write modification
function to avoid needlessly strong synchronization when the
expected value is not equal to the read value.
If ByteListEqual (rawBytesRead ,
expectedBytes ) is true , then
Let second be a new read-modify-write
modification function with parameters
(oldBytes , newBytes ) that captures nothing and
performs the following steps atomically when called:
Return newBytes .
Let event be ReadModifyWriteSharedMemory
{ [[Order]] : seq-cst , [[NoTear]] : true , [[Block]] : block , [[ByteIndex]] : byteIndexInBuffer , [[ElementSize]] : elementSize , [[Payload]] : replacementBytes , [[ModifyOp]] : second }.
Else,
Let event be ReadSharedMemory
{ [[Order]] : seq-cst , [[NoTear]] : true , [[Block]] : block , [[ByteIndex]] : byteIndexInBuffer , [[ElementSize]] : elementSize }.
Append event to eventsRecord .[[EventList]] .
Append Chosen Value Record { [[Event]] : event , [[ChosenValue]] : rawBytesRead } to
execution .[[ChosenValues]] .
Return rawBytesRead .
25.4.3.17 AtomicReadModifyWrite ( typedArray ,
index , value , op )
The abstract operation AtomicReadModifyWrite takes arguments typedArray (an
ECMAScript language value ),
index (an ECMAScript language value ),
value (an ECMAScript language value ), and
op (a read-modify-write modification
function ) and returns either a normal completion
containing either a Number or a BigInt, or a throw completion .
op takes two List of
byte
values arguments and returns a List of byte
values . This operation atomically loads a value, combines it with
another value, and stores the combination. It returns the loaded value. It performs the
following steps when called:
Let byteIndexInBuffer be ? ValidateAtomicAccessOnIntegerTypedArray (typedArray ,
index ).
If typedArray .[[ContentType]] is
bigint , let v be ? ToBigInt (value ).
Otherwise, let v be 𝔽 (? ToIntegerOrInfinity (value )).
Perform ? RevalidateAtomicAccess (typedArray ,
byteIndexInBuffer ).
Let buffer be typedArray .[[ViewedArrayBuffer]] .
Let elementType be TypedArrayElementType (typedArray ).
Return GetModifySetValueInBuffer (buffer ,
byteIndexInBuffer , elementType , v , op ).
25.4.3.18 ByteListBitwiseOp ( op , xBytes ,
yBytes )
The abstract operation ByteListBitwiseOp takes arguments op (&,
^, or |), xBytes (a List of byte
values ), and yBytes (a List of byte
values ) and returns a List of byte
values . The operation atomically performs a bitwise operation on all
byte
values of the arguments and returns a List of byte
values . It performs the following steps when called:
Assert :
xBytes and yBytes have the same number of elements.
Let result be a new empty List .
Let i be 0.
For each element xByte of xBytes , do
Let yByte be yBytes [i ].
If op is &, then
Let resultByte be the result of applying the bitwise AND
operation to xByte and yByte .
Else if op is ^, then
Let resultByte be the result of applying the bitwise
exclusive OR (XOR) operation to xByte and
yByte .
Else,
Assert : op is
|.
Let resultByte be the result of applying the bitwise
inclusive OR operation to xByte and yByte .
Set i to i + 1.
Append resultByte to result .
Return result .
25.4.3.19 ByteListEqual ( xBytes , yBytes )
The abstract operation ByteListEqual takes arguments xBytes (a List of byte
values ) and yBytes (a List of byte
values ) and returns a Boolean. It performs the following steps when
called:
If xBytes and yBytes do not have the same number of elements,
return false .
Let i be 0.
For each element xByte of xBytes , do
Let yByte be yBytes [i ].
If xByte ≠ yByte , return false .
Set i to i + 1.
Return true .
25.4.4 Atomics.add ( typedArray , index ,
value )
This function performs the following steps when called:
Let add be a new read-modify-write modification
function with parameters (xBytes , yBytes )
that captures typedArray and performs the following steps atomically when
called:
Let type be TypedArrayElementType (typedArray ).
Let isLittleEndian be the value of the [[LittleEndian]] field of the surrounding agent 's Agent
Record .
Let x be RawBytesToNumeric (type ,
xBytes , isLittleEndian ).
Let y be RawBytesToNumeric (type ,
yBytes , isLittleEndian ).
If x is a
Number , then
Let sum be Number::add (x ,
y ).
Else,
Assert : x is a
BigInt .
Let sum be BigInt::add (x ,
y ).
Let sumBytes be NumericToRawBytes (type ,
sum , isLittleEndian ).
Assert : sumBytes ,
xBytes , and yBytes have the same number of elements.
Return sumBytes .
Return ? AtomicReadModifyWrite (typedArray ,
index , value , add ).
25.4.5 Atomics.and ( typedArray , index ,
value )
This function performs the following steps when called:
Let and be a new read-modify-write modification
function with parameters (xBytes , yBytes )
that captures nothing and performs the following steps atomically when called:
Return ByteListBitwiseOp (&,
xBytes , yBytes ).
Return ? AtomicReadModifyWrite (typedArray ,
index , value , and ).
25.4.6 Atomics.compareExchange ( typedArray ,
index , expectedValue , replacementValue )
This function performs the following steps when called:
Let byteIndexInBuffer be ? ValidateAtomicAccessOnIntegerTypedArray (typedArray ,
index ).
Let buffer be typedArray .[[ViewedArrayBuffer]] .
Let block be buffer .[[ArrayBufferData]] .
If typedArray .[[ContentType]] is
bigint , then
Let expected be ? ToBigInt (expectedValue ).
Let replacement be ? ToBigInt (replacementValue ).
Else,
Let expected be 𝔽 (? ToIntegerOrInfinity (expectedValue )).
Let replacement be 𝔽 (? ToIntegerOrInfinity (replacementValue )).
Perform ? RevalidateAtomicAccess (typedArray ,
byteIndexInBuffer ).
Let elementType be TypedArrayElementType (typedArray ).
Let elementSize be TypedArrayElementSize (typedArray ).
Let isLittleEndian be the value of the [[LittleEndian]] field of the surrounding
agent 's Agent Record .
Let expectedBytes be NumericToRawBytes (elementType ,
expected , isLittleEndian ).
Let replacementBytes be NumericToRawBytes (elementType ,
replacement , isLittleEndian ).
If IsSharedArrayBuffer (buffer )
is true , then
Let rawBytesRead be AtomicCompareExchangeInSharedBlock (block ,
byteIndexInBuffer , elementSize , expectedBytes ,
replacementBytes ).
Else,
Let rawBytesRead be a List of
length elementSize whose elements are the sequence of
elementSize bytes starting with
block [byteIndexInBuffer ].
If ByteListEqual (rawBytesRead ,
expectedBytes ) is true , then
Store the individual bytes of replacementBytes into
block , starting at
block [byteIndexInBuffer ].
Return RawBytesToNumeric (elementType ,
rawBytesRead , isLittleEndian ).
25.4.7 Atomics.exchange ( typedArray , index ,
value )
This function performs the following steps when called:
Let second be a new read-modify-write modification
function with parameters (oldBytes ,
newBytes ) that captures nothing and performs the following steps atomically
when called:
Return newBytes .
Return ? AtomicReadModifyWrite (typedArray ,
index , value , second ).
25.4.8 Atomics.isLockFree ( size )
This function performs the following steps when called:
Let n be ? ToIntegerOrInfinity (size ).
Let AR be the Agent Record of the surrounding
agent .
If n = 1, return AR .[[IsLockFree1]] .
If n = 2, return AR .[[IsLockFree2]] .
If n = 4, return true .
If n = 8, return AR .[[IsLockFree8]] .
Return false .
Note
This function is an optimization primitive. The intuition is that if the atomic step of
an atomic primitive (compareExchange, load,
store, add, sub, and,
or, xor, or exchange) on a datum of size
n bytes will be performed without the surrounding agent
acquiring a lock outside the n bytes comprising the datum, then
Atomics.isLockFree(n ) will return true .
High-performance algorithms will use this function to determine whether to use locks or
atomic operations in critical sections . If an atomic
primitive is not lock-free then it is often more efficient for an algorithm to provide
its own locking.
Atomics.isLockFree(4) always returns true as that can be
supported on all known relevant hardware. Being able to assume this will generally
simplify programs.
Regardless of the value returned by this function, all atomic operations are guaranteed
to be atomic. For example, they will never have a visible operation take place in the
middle of the operation (e.g., "tearing").
25.4.9 Atomics.load ( typedArray , index )
This function performs the following steps when called:
Let byteIndexInBuffer be ? ValidateAtomicAccessOnIntegerTypedArray (typedArray ,
index ).
Perform ? RevalidateAtomicAccess (typedArray ,
byteIndexInBuffer ).
Let buffer be typedArray .[[ViewedArrayBuffer]] .
Let elementType be TypedArrayElementType (typedArray ).
Return GetValueFromBuffer (buffer ,
byteIndexInBuffer , elementType , true ,
seq-cst ).
25.4.10 Atomics.or ( typedArray , index ,
value )
This function performs the following steps when called:
Let or be a new read-modify-write modification
function with parameters (xBytes , yBytes )
that captures nothing and performs the following steps atomically when called:
Return ByteListBitwiseOp (|,
xBytes , yBytes ).
Return ? AtomicReadModifyWrite (typedArray ,
index , value , or ).
25.4.11 Atomics.store ( typedArray , index ,
value )
This function performs the following steps when called:
Let byteIndexInBuffer be ? ValidateAtomicAccessOnIntegerTypedArray (typedArray ,
index ).
If typedArray .[[ContentType]] is
bigint , let v be ? ToBigInt (value ).
Otherwise, let v be 𝔽 (? ToIntegerOrInfinity (value )).
Perform ? RevalidateAtomicAccess (typedArray ,
byteIndexInBuffer ).
Let buffer be typedArray .[[ViewedArrayBuffer]] .
Let elementType be TypedArrayElementType (typedArray ).
Perform SetValueInBuffer (buffer ,
byteIndexInBuffer , elementType , v ,
true , seq-cst ).
Return v .
25.4.12 Atomics.sub ( typedArray , index ,
value )
This function performs the following steps when called:
Let subtract be a new read-modify-write modification
function with parameters (xBytes , yBytes )
that captures typedArray and performs the following steps atomically when
called:
Let type be TypedArrayElementType (typedArray ).
Let isLittleEndian be the value of the [[LittleEndian]] field of the surrounding agent 's Agent
Record .
Let x be RawBytesToNumeric (type ,
xBytes , isLittleEndian ).
Let y be RawBytesToNumeric (type ,
yBytes , isLittleEndian ).
If x is a
Number , then
Let difference be Number::subtract (x ,
y ).
Else,
Assert : x is a
BigInt .
Let difference be BigInt::subtract (x ,
y ).
Let differenceBytes be NumericToRawBytes (type ,
difference , isLittleEndian ).
Assert : differenceBytes ,
xBytes , and yBytes have the same number of elements.
Return differenceBytes .
Return ? AtomicReadModifyWrite (typedArray ,
index , value , subtract ).
25.4.13 Atomics.wait ( typedArray , index ,
value , timeout )
This function puts the surrounding agent in a wait queue and suspends
it until notified or until the wait times out, returning a String differentiating those cases.
It performs the following steps when called:
Return ? DoWait (sync ,
typedArray , index , value , timeout ).
25.4.14 Atomics.waitAsync ( typedArray , index ,
value , timeout )
This function returns a Promise that is resolved when the calling agent is notified or the timeout is reached.
It performs the following steps when called:
Return ? DoWait (async ,
typedArray , index , value , timeout ).
25.4.15 Atomics.notify ( typedArray , index ,
count )
This function notifies some agents that are sleeping in the wait queue.
It performs the following steps when called:
Let taRecord be ? ValidateIntegerTypedArray (typedArray ,
true ).
Let byteIndexInBuffer be ? ValidateAtomicAccess (taRecord ,
index ).
If count is undefined , then
Let c be +∞.
Else,
Let intCount be ? ToIntegerOrInfinity (count ).
Let c be max (intCount , 0).
Let buffer be typedArray .[[ViewedArrayBuffer]] .
Let block be buffer .[[ArrayBufferData]] .
If IsSharedArrayBuffer (buffer )
is false , return +0 𝔽 .
Let WL be GetWaiterList (block ,
byteIndexInBuffer ).
Perform EnterCriticalSection (WL ).
Let S be RemoveWaiters (WL ,
c ).
For each element W of S , do
Perform NotifyWaiter (WL ,
W ).
Perform LeaveCriticalSection (WL ).
Let n be the number of elements in S .
Return 𝔽 (n ).
25.4.16 Atomics.xor ( typedArray , index ,
value )
This function performs the following steps when called:
Let xor be a new read-modify-write modification
function with parameters (xBytes , yBytes )
that captures nothing and performs the following steps atomically when called:
Return ByteListBitwiseOp (^,
xBytes , yBytes ).
Return ? AtomicReadModifyWrite (typedArray ,
index , value , xor ).
25.4.17 Atomics [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is the
String value "Atomics" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
25.5 The JSON Object
The JSON object:
is %JSON% .
is the initial value of the "JSON" property of the global
object .
is an ordinary
object .
contains two functions, parse and stringify, that are used to parse
and construct JSON texts.
has a [[Prototype]] internal slot whose value is %Object.prototype% .
does not have a [[Construct]] internal method; it cannot be used as a
constructor
with the new operator.
does not have a [[Call]] internal method; it cannot be invoked as a
function.
The JSON Data Interchange Format is defined in ECMA-404. The JSON interchange format used in this
specification is exactly that described by ECMA-404. Conforming implementations of
JSON.parse and JSON.stringify must support the exact interchange format
described in the ECMA-404 specification without any deletions or extensions to the format.
25.5.1 JSON.parse ( text [ , reviver ] )
This function parses a JSON text (a JSON-formatted String) and produces an ECMAScript language value . The JSON
format represents literals, arrays, and objects with a syntax similar to the syntax for
ECMAScript literals, Array Initializers, and Object Initializers. After parsing, JSON objects
are realized as ECMAScript objects. JSON arrays are realized as ECMAScript Array instances. JSON
strings, numbers, booleans, and null are realized as ECMAScript Strings, Numbers, Booleans, and
null .
The optional reviver parameter is a function that takes two parameters, key
and value . It can filter and transform the results. It is called with each of the
key /value pairs produced by the parse, and its return value is used
instead of the original value. If it returns what it received, the structure is not modified. If
it returns undefined then the property is deleted from the result.
Let jsonString be ? ToString (text ).
Let unfiltered be ? ParseJSON (jsonString ).
If IsCallable (reviver ) is
true , then
Let root be OrdinaryObjectCreate (%Object.prototype% ).
Let rootName be the empty String.
Perform ! CreateDataPropertyOrThrow (root ,
rootName , unfiltered ).
Return ? InternalizeJSONProperty (root ,
rootName , reviver ).
Else,
Return unfiltered .
The "length" property of this function is 2 𝔽 .
25.5.1.1 ParseJSON ( text )
The abstract operation ParseJSON takes argument text (a String) and returns either
a normal completion
containing an ECMAScript language
value or a throw
completion . It performs the following steps when called:
If StringToCodePoints (text )
is not a valid JSON text as specified in ECMA-404, throw a
SyntaxError exception.
Let scriptString be the string-concatenation of
"(" , text , and ");" .
Let script be ParseText (scriptString ,
Script ).
NOTE: The early
error rules defined in 13.2.5.1
have special handling for the above invocation of ParseText .
Assert :
script is a Parse Node .
Let result be ! Evaluation of script .
NOTE: The PropertyDefinitionEvaluation
semantics defined in 13.2.5.5
have special handling for the above evaluation.
Assert : result is either a String,
a Number, a Boolean, an Object that is defined by either an ArrayLiteral or an
ObjectLiteral , or
null .
Return result .
It is not permitted for a conforming implementation of JSON.parse to extend the
JSON grammars. If an implementation wishes to support a modified or extended JSON
interchange format it must do so by defining a different parse function.
Note 1
Valid JSON text is a subset of the ECMAScript PrimaryExpression syntax. Step
1 verifies that
jsonString conforms to that subset, and step 8 asserts that evaluation
returns a value of an appropriate type.
However, because 13.2.5.5
behaves differently during ParseJSON, the same source text can produce different
results when evaluated as a PrimaryExpression rather than as
JSON. Furthermore, the Early Error for duplicate "__proto__"
properties in object literals, which likewise does not apply during ParseJSON, means
that not all texts accepted by ParseJSON are valid as a PrimaryExpression , despite
matching the grammar.
Note 2
In the case where there are duplicate name Strings within an object, lexically
preceding values for the same key shall be overwritten.
25.5.1.2 InternalizeJSONProperty ( holder ,
name , reviver )
The abstract operation InternalizeJSONProperty takes arguments holder (an Object),
name (a String), and reviver (a function object ) and returns
either a normal completion
containing an ECMAScript language
value or a throw
completion .
Note
This algorithm intentionally does not throw an exception if either [[Delete]] or CreateDataProperty return
false .
It performs the following steps when called:
Let val be ? Get (holder , name ).
If val is an Object , then
Let isArray be ? IsArray (val ).
If isArray is true , then
Let len be ? LengthOfArrayLike (val ).
Let I be 0.
Repeat, while I < len ,
Let prop be ! ToString (𝔽 (I )).
Let newElement be ? InternalizeJSONProperty (val ,
prop , reviver ).
If newElement is undefined ,
then
Perform ? val .[[Delete]] (prop ).
Else,
Perform ? CreateDataProperty (val ,
prop , newElement ).
Set I to I + 1.
Else,
Let keys be ? EnumerableOwnProperties (val ,
key ).
For each String P of keys , do
Let newElement be ? InternalizeJSONProperty (val ,
P , reviver ).
If newElement is undefined ,
then
Perform ? val .[[Delete]] (P ).
Else,
Perform ? CreateDataProperty (val ,
P , newElement ).
Return ? Call (reviver ,
holder , « name , val »).
25.5.2 JSON.stringify ( value [ , replacer [ ,
space ] ] )
This function returns a String in UTF-16 encoded JSON format representing an ECMAScript language value , or
undefined . It can take three parameters. The value parameter is an
ECMAScript language value , which is
usually an object or array, although it can also be a String, Boolean, Number or
null . The optional replacer parameter is either a function that
alters the way objects and arrays are stringified, or an array of Strings and Numbers that acts
as an inclusion list for selecting the object properties that will be stringified. The optional
space parameter is a
String or Number that allows the result to have white space injected into
it to improve human readability.
It performs the following steps when called:
Let stack be a new empty List .
Let indent be the empty String.
Let PropertyList be undefined .
Let ReplacerFunction be undefined .
If replacer is an Object , then
If IsCallable (replacer ) is
true , then
Set ReplacerFunction to replacer .
Else,
Let isArray be ? IsArray (replacer ).
If isArray is true , then
Set PropertyList to a new empty List .
Let len be ? LengthOfArrayLike (replacer ).
Let k be 0.
Repeat, while k < len ,
Let prop be ! ToString (𝔽 (k )).
Let v be ? Get (replacer ,
prop ).
Let item be undefined .
If v is
a String , then
Set item to v .
Else if v is
a Number , then
Set item to ! ToString (v ).
Else if v is an
Object , then
If v has a [[StringData]] or [[NumberData]] internal
slot, set item to ? ToString (v ).
If item is not undefined
and PropertyList does not contain
item , then
Append item to
PropertyList .
Set k to k + 1.
If space is an Object , then
If space has a [[NumberData]] internal slot,
then
Set space to ? ToNumber (space ).
Else if space has a [[StringData]] internal
slot, then
Set space to ? ToString (space ).
If space is a
Number , then
Let spaceMV be ! ToIntegerOrInfinity (space ).
Set spaceMV to min (10, spaceMV ).
If spaceMV < 1, let gap be the empty String; otherwise
let gap be the String value containing spaceMV occurrences
of the code unit 0x0020 (SPACE).
Else if space is a
String , then
If the length of space ≤ 10, let gap be space ;
otherwise let gap be the substring of
space from 0 to 10.
Else,
Let gap be the empty String.
Let wrapper be OrdinaryObjectCreate (%Object.prototype% ).
Perform ! CreateDataPropertyOrThrow (wrapper ,
the empty String, value ).
Let state be the JSON Serialization
Record { [[ReplacerFunction]] :
ReplacerFunction , [[Stack]] : stack , [[Indent]] : indent , [[Gap]] :
gap , [[PropertyList]] :
PropertyList }.
Return ? SerializeJSONProperty (state , the
empty String, wrapper ).
The "length" property of this function is 3 𝔽 .
Note 1
JSON structures are allowed to be nested to any depth, but they must be acyclic. If
value is or contains a cyclic structure, then this function must throw a
TypeError exception. This is an example of a value that cannot be
stringified:
a = [];
a[0 ] = a;
my_text = JSON .stringify (a);
Note 2
Symbolic primitive values are rendered as follows:
The null value is rendered in JSON text as the String value
"null" .
The undefined value is not rendered.
The true value is rendered in JSON text as the String value
"true" .
The false value is rendered in JSON text as the String value
"false" .
Note 3
String values are wrapped in QUOTATION MARK (") code units. The code units
" and \ are escaped with \ prefixes. Control
characters code units are replaced with escape sequences \uHHHH, or with
the shorter forms, \b (BACKSPACE), \f (FORM FEED),
\n (LINE FEED), \r (CARRIAGE RETURN), \t
(CHARACTER TABULATION).
Note 4
Finite numbers
are stringified as if by calling ToString (number ).
NaN and Infinity regardless of sign are
represented as the String value "null" .
Note 5
Values that do not have a JSON representation (such as undefined and
functions) do not produce a String. Instead they produce the
undefined value. In arrays these values are represented as the String
value "null" . In objects an unrepresentable value causes the property
to be excluded from stringification.
Note 6
An object is rendered as U+007B (LEFT CURLY BRACKET) followed by zero or more properties,
separated with a U+002C (COMMA), closed with a U+007D (RIGHT CURLY BRACKET). A property
is a quoted String representing the property name , a U+003A (COLON), and then
the stringified property value. An array is rendered as an opening U+005B (LEFT SQUARE
BRACKET) followed by zero or more values, separated with a U+002C (COMMA), closed with a
U+005D (RIGHT SQUARE BRACKET).
25.5.2.1 JSON Serialization Record
A JSON Serialization Record is
a Record value used to
enable serialization to the JSON format.
JSON Serialization Records have the fields listed in Table 80 .
Table 80: JSON Serialization
Record Fields
Field Name
Value
Meaning
[[ReplacerFunction]]
a function object or
undefined
A function that can supply replacement values for object properties
(from JSON.stringify's replacer parameter).
[[PropertyList]]
either a List
of Strings or undefined
The names of properties to include when serializing a non-array object
(from JSON.stringify's replacer parameter).
[[Gap]]
a String
The unit of indentation (from JSON.stringify's space
parameter).
[[Stack]]
a List
of Objects
The set of nested objects that are in the process of being serialized.
Used to detect cyclic structures.
[[Indent]]
a String
The current indentation.
25.5.2.2 SerializeJSONProperty ( state ,
key , holder )
The abstract operation SerializeJSONProperty takes arguments state (a JSON Serialization Record ),
key (a String), and holder (an Object) and returns either a normal completion
containing either a String or undefined , or a
throw completion . It
performs the following steps when called:
Let value be ? Get (holder , key ).
If value is an Object or value
is a
BigInt , then
Let toJSON be ? GetV (value ,
"toJSON" ).
If IsCallable (toJSON )
is true , then
Set value to ? Call (toJSON ,
value , « key »).
If state .[[ReplacerFunction]] is not
undefined , then
Set value to ? Call (state .[[ReplacerFunction]] , holder , «
key , value »).
If value is an Object , then
If value has a [[NumberData]] internal
slot, then
Set value to ? ToNumber (value ).
Else if value has a [[StringData]]
internal slot, then
Set value to ? ToString (value ).
Else if value has a [[BooleanData]]
internal slot, then
Set value to value .[[BooleanData]] .
Else if value has a [[BigIntData]]
internal slot, then
Set value to value .[[BigIntData]] .
If value is null , return "null" .
If value is true , return "true" .
If value is false , return "false" .
If value is a
String , return QuoteJSONString (value ).
If value is a
Number , then
If value is finite , return ! ToString (value ).
Return "null" .
If value is a
BigInt , throw a TypeError exception.
If value is an Object and IsCallable (value ) is
false , then
Let isArray be ? IsArray (value ).
If isArray is true , return ? SerializeJSONArray (state ,
value ).
Return ? SerializeJSONObject (state ,
value ).
Return undefined .
25.5.2.3 QuoteJSONString ( value )
The abstract operation QuoteJSONString takes argument value (a String) and returns
a String. It wraps value in 0x0022 (QUOTATION MARK) code units and escapes
certain other code units within it. This operation interprets value as a sequence
of UTF-16 encoded code points, as described in 6.1.4 . It performs
the following steps when called:
Let product be the String value consisting solely of the code unit 0x0022
(QUOTATION MARK).
For each code point C of StringToCodePoints (value ),
do
If C is listed in the “Code Point” column of Table 81 ,
then
Set product to the string-concatenation
of product and the escape sequence for C as
specified in the “Escape Sequence” column of the corresponding row.
Else if C has a numeric value less than 0x0020 (SPACE) or
C has the same numeric value as a leading surrogate or
trailing surrogate , then
Let unit be the code unit whose numeric value is the
numeric value of C .
Set product to the string-concatenation
of product and UnicodeEscape (unit ).
Else,
Set product to the string-concatenation
of product and UTF16EncodeCodePoint (C ).
Set product to the string-concatenation of
product and the code unit 0x0022 (QUOTATION MARK).
Return product .
Table 81: JSON Single Character Escape Sequences
Code Point
Unicode Character Name
Escape Sequence
U+0008
BACKSPACE
\b
U+0009
CHARACTER TABULATION
\t
U+000A
LINE FEED (LF)
\n
U+000C
FORM FEED (FF)
\f
U+000D
CARRIAGE RETURN (CR)
\r
U+0022
QUOTATION MARK
\"
U+005C
REVERSE SOLIDUS
\\
25.5.2.4 UnicodeEscape ( C )
The abstract operation UnicodeEscape takes argument C (a code unit) and returns a
String. It represents C as a Unicode escape sequence. It performs the following
steps when called:
Let n be the numeric value of C .
Assert :
n ≤ 0xFFFF.
Let hex be the String representation of n , formatted as a
lowercase hexadecimal number.
Return the string-concatenation of the code
unit 0x005C (REVERSE SOLIDUS), "u" , and StringPad (hex , 4,
"0" , start ).
25.5.2.5 SerializeJSONObject ( state ,
value )
The abstract operation SerializeJSONObject takes arguments state (a JSON Serialization Record ) and
value (an Object) and returns either a normal completion
containing a String or a throw completion . It
serializes an object. It performs the following steps when called:
If state .[[Stack]] contains value ,
throw a TypeError exception because the structure is cyclical.
Append value to state .[[Stack]] .
Let stepBack be state .[[Indent]] .
Set state .[[Indent]] to the string-concatenation of
state .[[Indent]] and state .[[Gap]] .
If state .[[PropertyList]] is not
undefined , then
Let K be state .[[PropertyList]] .
Else,
Let K be ? EnumerableOwnProperties (value ,
key ).
Let partial be a new empty List .
For each element P of K , do
Let strP be ? SerializeJSONProperty (state ,
P , value ).
If strP is not undefined , then
Let member be QuoteJSONString (P ).
Set member to the string-concatenation
of member and ":" .
If state .[[Gap]] is not the
empty String, then
Set member to the string-concatenation
of member and the code unit 0x0020 (SPACE).
Set member to the string-concatenation
of member and strP .
Append member to partial .
If partial is empty, then
Let final be "{}" .
Else,
If state .[[Gap]] is the empty String,
then
Let properties be the String value formed by
concatenating all the element Strings of partial with
each adjacent pair of Strings separated with the code unit 0x002C
(COMMA). A comma is not inserted either before the first String or
after the last String.
Let final be the string-concatenation
of "{" , properties , and
"}" .
Else,
Let separator be the string-concatenation
of the code unit 0x002C (COMMA), the code unit 0x000A (LINE FEED),
and state .[[Indent]] .
Let properties be the String value formed by
concatenating all the element Strings of partial with
each adjacent pair of Strings separated with separator .
The separator String is not inserted either before the
first String or after the last String.
Let final be the string-concatenation
of "{" , the code unit 0x000A (LINE FEED),
state .[[Indent]] ,
properties , the code unit 0x000A (LINE FEED),
stepBack , and "}" .
Remove the last element of state .[[Stack]] .
Set state .[[Indent]] to stepBack .
Return final .
25.5.2.6 SerializeJSONArray ( state , value
)
The abstract operation SerializeJSONArray takes arguments state (a JSON Serialization Record ) and
value (an ECMAScript language value ) and
returns either a normal completion
containing a String or a throw completion . It
serializes an array. It performs the following steps when called:
If state .[[Stack]] contains value ,
throw a TypeError exception because the structure is cyclical.
Append value to state .[[Stack]] .
Let stepBack be state .[[Indent]] .
Set state .[[Indent]] to the string-concatenation of
state .[[Indent]] and state .[[Gap]] .
Let partial be a new empty List .
Let len be ? LengthOfArrayLike (value ).
Let index be 0.
Repeat, while index < len ,
Let strP be ? SerializeJSONProperty (state ,
! ToString (𝔽 (index )),
value ).
If strP is undefined , then
Append "null" to partial .
Else,
Append strP to partial .
Set index to index + 1.
If partial is empty, then
Let final be "[]" .
Else,
If state .[[Gap]] is the empty String,
then
Let properties be the String value formed by
concatenating all the element Strings of partial with
each adjacent pair of Strings separated with the code unit 0x002C
(COMMA). A comma is not inserted either before the first String or
after the last String.
Let final be the string-concatenation
of "[" , properties , and
"]" .
Else,
Let separator be the string-concatenation
of the code unit 0x002C (COMMA), the code unit 0x000A (LINE FEED),
and state .[[Indent]] .
Let properties be the String value formed by
concatenating all the element Strings of partial with
each adjacent pair of Strings separated with separator .
The separator String is not inserted either before the
first String or after the last String.
Let final be the string-concatenation
of "[" , the code unit 0x000A (LINE FEED),
state .[[Indent]] ,
properties , the code unit 0x000A (LINE FEED),
stepBack , and "]" .
Remove the last element of state .[[Stack]] .
Set state .[[Indent]] to stepBack .
Return final .
Note
The representation of arrays includes only the elements in the interval
from +0 𝔽 (inclusive) to array.length
(exclusive). Properties whose keys are not array indices are excluded
from the stringification. An array is stringified as an opening LEFT SQUARE BRACKET,
elements separated by COMMA, and a closing RIGHT SQUARE BRACKET.
25.5.3 JSON [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is the
String value "JSON" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
26 Managing Memory
26.1 WeakRef Objects
A WeakRef is an object that is used to refer
to a target object or symbol without preserving it from garbage collection. WeakRefs can be dereferenced to allow access
to the target value, if the target hasn't been reclaimed by garbage collection.
26.1.1 The WeakRef Constructor
The WeakRef constructor :
is %WeakRef% .
is the initial value of the "WeakRef" property of the global
object .
creates and initializes a new WeakRef when called as a constructor .
is not intended to be called as a function and will throw an exception when called in that
manner.
may be used as the value in an extends clause of a class definition. Subclass
constructors that intend to inherit the specified
WeakRef behaviour must include a super call to the
WeakRef constructor to create and initialize the subclass
instance with the internal state necessary to support the WeakRef.prototype
built-in methods.
26.1.1.1 WeakRef ( target )
This function performs the following steps when called:
If NewTarget is undefined , throw a TypeError
exception.
If CanBeHeldWeakly (target )
is false , throw a TypeError exception.
Let weakRef be ? OrdinaryCreateFromConstructor (NewTarget,
"%WeakRef.prototype%" , « [[WeakRefTarget]] »).
Perform AddToKeptObjects (target ).
Set weakRef .[[WeakRefTarget]] to
target .
Return weakRef .
26.1.2 Properties of the WeakRef Constructor
The WeakRef constructor :
has a [[Prototype]] internal slot whose value is %Function.prototype% .
has the following properties:
26.1.2.1 WeakRef.prototype
The initial value of WeakRef.prototype is the WeakRef prototype
object .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }.
26.1.3 Properties of the WeakRef Prototype Object
The WeakRef prototype object :
26.1.3.1 WeakRef.prototype.constructor
The initial value of WeakRef.prototype.constructor is %WeakRef% .
26.1.3.2 WeakRef.prototype.deref ( )
This method performs the following steps when called:
Let weakRef be the this value.
Perform ? RequireInternalSlot (weakRef ,
[[WeakRefTarget]] ).
Return WeakRefDeref (weakRef ).
Note
If the WeakRef returns a
target value that is not undefined , then this
target value should not be garbage collected until the current execution
of ECMAScript code has completed. The AddToKeptObjects
operation makes sure read consistency is maintained.
let target = { foo ( ) {} };
let weakRef = new WeakRef (target);
if (weakRef.deref ()) {
weakRef.deref ().foo ();
}
In the above example, if the first deref does not evaluate to
undefined then the second deref cannot either.
26.1.3.3 WeakRef.prototype [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is the
String value "WeakRef" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
26.1.4 WeakRef Abstract Operations
26.1.4.1 WeakRefDeref ( weakRef )
The abstract operation WeakRefDeref takes argument weakRef (a WeakRef ) and returns an ECMAScript language value . It
performs the following steps when called:
Let target be weakRef .[[WeakRefTarget]] .
If target is not empty , then
Perform AddToKeptObjects (target ).
Return target .
Return undefined .
Note
This abstract operation is defined separately from WeakRef.prototype.deref strictly
to make it possible to succinctly define liveness.
26.1.5 Properties of WeakRef Instances
WeakRef instances are ordinary
objects that inherit properties from the WeakRef prototype
object . WeakRef instances also have a [[WeakRefTarget]] internal slot.
26.2 FinalizationRegistry Objects
A FinalizationRegistry is an
object that manages registration and unregistration of cleanup operations that are performed when
target objects and symbols are garbage collected.
26.2.1 The FinalizationRegistry Constructor
The FinalizationRegistry constructor :
is %FinalizationRegistry% .
is the initial value of the "FinalizationRegistry" property of the
global
object .
creates and initializes a new FinalizationRegistry when called as a constructor .
is not intended to be called as a function and will throw an exception when called in that
manner.
may be used as the value in an extends clause of a class definition. Subclass
constructors that intend to inherit the specified
FinalizationRegistry behaviour must include a super call to the
FinalizationRegistry constructor to create and initialize the subclass
instance with the internal state necessary to support the
FinalizationRegistry.prototype built-in methods.
26.2.1.1 FinalizationRegistry ( cleanupCallback )
This function performs the following steps when called:
If NewTarget is undefined , throw a TypeError
exception.
If IsCallable (cleanupCallback )
is false , throw a TypeError exception.
Let finalizationRegistry be ? OrdinaryCreateFromConstructor (NewTarget,
"%FinalizationRegistry.prototype%" , « [[Realm]] , [[CleanupCallback]] ,
[[Cells]] »).
Let fn be the active function object .
Set finalizationRegistry .[[Realm]] to
fn .[[Realm]] .
Set finalizationRegistry .[[CleanupCallback]] to
HostMakeJobCallback (cleanupCallback ).
Set finalizationRegistry .[[Cells]] to a new
empty List .
Return finalizationRegistry .
26.2.2 Properties of the FinalizationRegistry Constructor
The FinalizationRegistry
constructor :
has a [[Prototype]] internal slot whose value is %Function.prototype% .
has the following properties:
26.2.2.1 FinalizationRegistry.prototype
The initial value of FinalizationRegistry.prototype is the FinalizationRegistry
prototype object .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }.
26.2.3 Properties of the FinalizationRegistry Prototype Object
The FinalizationRegistry prototype object :
is %FinalizationRegistry.prototype% .
has a [[Prototype]] internal slot whose value is %Object.prototype% .
is an ordinary
object .
does not have [[Cells]] and [[CleanupCallback]] internal slots.
26.2.3.1 FinalizationRegistry.prototype.constructor
The initial value of FinalizationRegistry.prototype.constructor is %FinalizationRegistry% .
26.2.3.2 FinalizationRegistry.prototype.register (
target , heldValue [ , unregisterToken ] )
This method performs the following steps when called:
Let finalizationRegistry be the this value.
Perform ? RequireInternalSlot (finalizationRegistry ,
[[Cells]] ).
If CanBeHeldWeakly (target )
is false , throw a TypeError exception.
If SameValue (target ,
heldValue ) is true , throw a
TypeError exception.
If CanBeHeldWeakly (unregisterToken )
is false , then
If unregisterToken is not undefined , throw a
TypeError exception.
Set unregisterToken to empty .
Let cell be the Record { [[WeakRefTarget]] : target , [[HeldValue]] : heldValue , [[UnregisterToken]] : unregisterToken }.
Append cell to finalizationRegistry .[[Cells]] .
Return undefined .
Note
Based on the algorithms and definitions in this specification, cell .[[HeldValue]] is live when
finalizationRegistry .[[Cells]] contains
cell ; however, this does not necessarily mean that cell .[[UnregisterToken]] or cell .[[Target]] are live . For example,
registering an object with itself as its unregister token would not keep the object
alive forever.
26.2.3.3 FinalizationRegistry.prototype.unregister (
unregisterToken )
This method performs the following steps when called:
Let finalizationRegistry be the this value.
Perform ? RequireInternalSlot (finalizationRegistry ,
[[Cells]] ).
If CanBeHeldWeakly (unregisterToken )
is false , throw a TypeError exception.
Let removed be false .
For each Record { [[WeakRefTarget]] , [[HeldValue]] ,
[[UnregisterToken]] } cell of
finalizationRegistry .[[Cells]] , do
If cell .[[UnregisterToken]] is not
empty and SameValue (cell .[[UnregisterToken]] , unregisterToken ) is
true , then
Remove cell from finalizationRegistry .[[Cells]] .
Set removed to true .
Return removed .
26.2.3.4 FinalizationRegistry.prototype [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is the
String value "FinalizationRegistry" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
26.2.4 Properties of FinalizationRegistry Instances
FinalizationRegistry
instances are ordinary objects that inherit properties from the
FinalizationRegistry
prototype object . FinalizationRegistry
instances also have [[Cells]] and [[CleanupCallback]] internal slots.
27 Control Abstraction Objects
27.1 Iteration
27.1.1 Common Iteration Interfaces
An interface is a set of property keys whose associated values match a
specific specification. Any object that provides all the properties as described by an
interface's specification conforms to that interface. An interface is not represented
by a distinct object. There may be many separately implemented objects that conform to any
interface. An individual object may conform to multiple interfaces.
27.1.1.1 The Iterable Interface
The iterable interface includes the property described in Table 82 :
Table 82: Iterable Interface Required
Properties
27.1.1.2 The Iterator Interface
An object that implements the iterator
interface must include the property in Table 83 . Such
objects may also implement the properties in Table 84 .
Table 83: Iterator Interface Required
Properties
Note 1
Arguments may be passed to the next function but their interpretation
and validity is dependent upon the target iterator. The for-of statement and other
common users of iterators do not pass any arguments, so iterator objects that expect
to be used in such a manner must be prepared to deal with being called with no
arguments.
Table 84: Iterator Interface Optional
Properties
Property
Value
Requirements
"return"
a function that returns an IteratorResult
object
The returned object must conform to the IteratorResult
interface . Invoking this method notifies the
iterator object
that the caller does not intend to make any more next
method calls to the iterator . The
returned IteratorResult
object will typically have a
"done" property whose value is
true , and a "value" property with
the value passed as the argument of the return method.
However, this requirement is not enforced.
"throw"
a function that returns an IteratorResult
object
The returned object must conform to the IteratorResult
interface . Invoking this method notifies the
iterator object
that the caller has detected an error condition. The argument may be
used to identify the error condition and typically will be an exception
object. A typical response is to throw the value passed as
the argument. If the method does not throw, the returned
IteratorResult
object will typically have a
"done" property whose value is
true .
Note 2
Typically callers of these methods should check for their existence before invoking
them. Certain ECMAScript language features including
for-of, yield*, and array destructuring call
these methods after performing an existence check. Most ECMAScript library functions
that accept iterable objects as arguments
also conditionally call them.
27.1.1.3 The Async Iterable Interface
The async iterable interface includes the properties described in
Table
85 :
Table 85: Async Iterable Interface Required
Properties
27.1.1.4 The Async Iterator Interface
An object that implements the async iterator interface must include the properties in Table 86 . Such objects may also
implement the properties in Table 87 .
Table 86: Async Iterator Interface Required
Properties
Property
Value
Requirements
"next"
a function that returns a promise for an IteratorResult
object
The returned promise, when fulfilled, must fulfill with an object
that conforms to the IteratorResult
interface . If a previous call to the
next method of an async
iterator has returned a promise for an
IteratorResult
object whose "done"
property is true , then all subsequent calls to
the next method of that object should also return a
promise for an IteratorResult
object whose "done"
property is true . However, this requirement is
not enforced.
Additionally, the IteratorResult
object that serves as a fulfillment value
should have a "value" property whose value is not
a promise (or "thenable"). However, this requirement is also not
enforced.
Note 1
Arguments may be passed to the next function but their interpretation
and validity is dependent upon the target async iterator. The
for-await-of statement and other common users
of async iterators do not pass any arguments, so async iterator objects that expect
to be used in such a manner must be prepared to deal with being called with no
arguments.
Table 87: Async Iterator Interface Optional
Properties
Property
Value
Requirements
"return"
a function that returns a promise for an IteratorResult
object
The returned promise, when fulfilled, must fulfill with an object
that conforms to the IteratorResult
interface . Invoking this method notifies the
async iterator
object that the caller does not intend to
make any more next method calls to the async
iterator . The returned promise will fulfill
with an IteratorResult
object which will typically have a
"done" property whose value is
true , and a "value" property
with the value passed as the argument of the return
method. However, this requirement is not enforced.
Additionally, the IteratorResult
object that serves as a fulfillment value
should have a "value" property whose value is not
a promise (or "thenable"). If the argument value is used in the
typical manner, then if it is a rejected promise, a promise rejected
with the same reason should be returned; if it is a fulfilled
promise, then its fulfillment value should be used as the
"value" property of the returned promise's
IteratorResult
object fulfillment value. However, these
requirements are also not enforced.
"throw"
a function that returns a promise for an IteratorResult
object
The returned promise, when fulfilled, must fulfill with an object
that conforms to the IteratorResult
interface . Invoking this method notifies the
async iterator
object that the caller has detected an error
condition. The argument may be used to identify the error condition
and typically will be an exception object. A typical response is to
return a rejected promise which rejects with the value passed as the
argument.
If the returned promise is fulfilled, the IteratorResult
object fulfillment value will typically have
a "done" property whose value is
true . Additionally, it should have a
"value" property whose value is not a promise (or
"thenable"), but this requirement is not enforced.
Note 2
Typically callers of these methods should check for their existence before invoking
them. Certain ECMAScript language features including
for-await-of and yield* call
these methods after performing an existence check.
27.1.1.5 The IteratorResult Interface
The IteratorResult
interface includes the properties listed in Table 88 :
Table 88: IteratorResult Interface Properties
Property
Value
Requirements
"done"
a Boolean
This is the result status of an iterator
next method call. If the end of the iterator was
reached "done" is true . If the end
was not reached "done" is false
and a value is available. If a "done" property
(either own or inherited) does not exist, it is considered to have the
value false .
"value"
an ECMAScript language
value
If done is false , this is the current iteration
element value. If done is true , this is the return
value of the iterator , if it
supplied one. If the iterator does not
have a return value, "value" is
undefined . In that case, the
"value" property may be absent from the conforming
object if it does not inherit an explicit "value"
property.
27.1.2 Iterator Helper Objects
An Iterator Helper object is an
ordinary
object that represents a lazy transformation of some specific source
iterator object . There is not a named
constructor
for Iterator Helper objects. Instead, Iterator Helper objects are created by calling certain
methods of Iterator instance objects.
27.1.2.1 The %IteratorHelperPrototype% Object
The %IteratorHelperPrototype% object:
27.1.2.1.1 %IteratorHelperPrototype%.next ( )
Return ? GeneratorResume (this
value, undefined , "Iterator Helper" ).
27.1.2.1.2 %IteratorHelperPrototype%.return ( )
Let O be this value.
Perform ? RequireInternalSlot (O ,
[[UnderlyingIterator]] ).
Assert : O has a [[GeneratorState]] internal slot.
If O .[[GeneratorState]] is
suspended-start , then
Set O .[[GeneratorState]] to
completed .
NOTE: Once a generator enters the completed state it never leaves it and
its associated execution
context is never resumed. Any execution state
associated with O can be discarded at this point.
Perform ? IteratorClose (O .[[UnderlyingIterator]] , NormalCompletion (unused )).
Return CreateIteratorResultObject (undefined ,
true ).
Let C be ReturnCompletion (undefined ).
Return ? GeneratorResumeAbrupt (O ,
C , "Iterator Helper" ).
27.1.2.1.3 %IteratorHelperPrototype% [ %Symbol.toStringTag%
]
The initial value of the %Symbol.toStringTag% property is
the String value "Iterator Helper" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] :
false , [[Configurable]] :
true }.
27.1.3 Iterator Objects
27.1.3.1 The Iterator Constructor
The Iterator constructor :
is %Iterator% .
is the initial value of the "Iterator" property of the global
object .
is designed to be subclassable. It may be used as the value of an
extends clause of a class definition.
27.1.3.1.1 Iterator ( )
This function performs the following steps when called:
If NewTarget is either undefined or the active function object ,
throw a TypeError exception.
Return ? OrdinaryCreateFromConstructor (NewTarget,
"%Iterator.prototype%" ).
27.1.3.2 Properties of the Iterator Constructor
The Iterator constructor :
has a [[Prototype]] internal slot whose value is %Function.prototype% .
has the following properties:
27.1.3.2.1 Iterator.from ( O )
Let iteratorRecord be ? GetIteratorFlattenable (O ,
iterate-string-primitives ).
Let hasInstance be ? OrdinaryHasInstance (%Iterator% ,
iteratorRecord .[[Iterator]] ).
If hasInstance is true , then
Return iteratorRecord .[[Iterator]] .
Let wrapper be OrdinaryObjectCreate (%WrapForValidIteratorPrototype% ,
« [[Iterated]] »).
Set wrapper .[[Iterated]] to
iteratorRecord .
Return wrapper .
27.1.3.2.1.1 The %WrapForValidIteratorPrototype% Object
The %WrapForValidIteratorPrototype% object:
27.1.3.2.1.1.1 %WrapForValidIteratorPrototype%.next
( )
Let O be this value.
Perform ? RequireInternalSlot (O ,
[[Iterated]] ).
Let iteratorRecord be O .[[Iterated]] .
Return ? Call (iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] ).
27.1.3.2.1.1.2
%WrapForValidIteratorPrototype%.return ( )
Let O be this value.
Perform ? RequireInternalSlot (O ,
[[Iterated]] ).
Let iterator be O .[[Iterated]] .[[Iterator]] .
Assert : iterator
is an Object .
Let returnMethod be ? GetMethod (iterator ,
"return" ).
If returnMethod is undefined , then
Return CreateIteratorResultObject (undefined ,
true ).
Return ? Call (returnMethod ,
iterator ).
27.1.3.2.2 Iterator.prototype
The initial value of Iterator.prototype is the Iterator prototype
object .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] :
false , [[Configurable]] :
false }.
27.1.4 Properties of the Iterator Prototype Object
The Iterator prototype object :
Note
All objects defined in this specification that implement the iterator interface also inherit
from %Iterator.prototype%. ECMAScript code may also define objects that inherit from
%Iterator.prototype%. %Iterator.prototype% provides a place where additional methods
that are applicable to all iterator objects may be added.
The following expression is one way that ECMAScript code can access the
%Iterator.prototype% object:
Object .getPrototypeOf (Object .getPrototypeOf ([][Symbol .iterator ]()))
27.1.4.1 Iterator.prototype.constructor
Iterator.prototype.constructor is an accessor property with
attributes { [[Enumerable]] : false , [[Configurable]] : true }. The [[Get]] and [[Set]] attributes are defined
as follows:
27.1.4.1.1 get Iterator.prototype.constructor
The value of the [[Get]] attribute is a built-in function that
requires no arguments. It performs the following steps when called:
Return %Iterator% .
27.1.4.1.2 set Iterator.prototype.constructor
The value of the [[Set]] attribute is a built-in function that
takes an argument v . It performs the following steps when called:
Perform ? SetterThatIgnoresPrototypeProperties (this
value, %Iterator.prototype% ,
"constructor" , v ).
Return undefined .
Note
Unlike the "constructor" property on most built-in prototypes, for
web-compatibility reasons this property must be an accessor.
27.1.4.2 Iterator.prototype.drop ( limit )
This method performs the following steps when called:
Let O be the this value.
If O is not an Object , throw a
TypeError exception.
Let iterated be the Iterator Record {
[[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }.
Let numLimit be Completion (ToNumber (limit )).
IfAbruptCloseIterator (numLimit ,
iterated ).
If numLimit is NaN , then
Let error be ThrowCompletion (a newly
created RangeError object).
Return ? IteratorClose (iterated ,
error ).
Let integerLimit be ! ToIntegerOrInfinity (numLimit ).
If integerLimit < 0, then
Let error be ThrowCompletion (a newly
created RangeError object).
Return ? IteratorClose (iterated ,
error ).
Set iterated to ? GetIteratorDirect (O ).
Let closure be a new Abstract Closure
with no parameters that captures iterated and integerLimit and
performs the following steps when called:
Let remaining be integerLimit .
Repeat, while remaining > 0,
If remaining ≠ +∞, then
Set remaining to remaining - 1.
Let next be ? IteratorStep (iterated ).
If next is done , return ReturnCompletion (undefined ).
Repeat,
Let value be ? IteratorStepValue (iterated ).
If value is done , return ReturnCompletion (undefined ).
Let completion be Completion (Yield (value )).
IfAbruptCloseIterator (completion ,
iterated ).
Let result be CreateIteratorFromClosure (closure ,
"Iterator Helper" , %IteratorHelperPrototype% ,
« [[UnderlyingIterator]] »).
Set result .[[UnderlyingIterator]] to
iterated .
Return result .
27.1.4.3 Iterator.prototype.every ( predicate )
This method performs the following steps when called:
Let O be the this value.
If O is not an Object , throw a
TypeError exception.
Let iterated be the Iterator Record {
[[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }.
If IsCallable (predicate ) is
false , then
Let error be ThrowCompletion (a newly
created TypeError object).
Return ? IteratorClose (iterated ,
error ).
Set iterated to ? GetIteratorDirect (O ).
Let counter be 0.
Repeat,
Let value be ? IteratorStepValue (iterated ).
If value is done , return
true .
Let result be Completion (Call (predicate ,
undefined , « value , 𝔽 (counter ) »)).
IfAbruptCloseIterator (result ,
iterated ).
If ToBoolean (result ) is
false , return ? IteratorClose (iterated ,
NormalCompletion (false )).
Set counter to counter + 1.
27.1.4.4 Iterator.prototype.filter ( predicate )
This method performs the following steps when called:
Let O be the this value.
If O is not an Object , throw a
TypeError exception.
Let iterated be the Iterator Record {
[[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }.
If IsCallable (predicate ) is
false , then
Let error be ThrowCompletion (a newly
created TypeError object).
Return ? IteratorClose (iterated ,
error ).
Set iterated to ? GetIteratorDirect (O ).
Let closure be a new Abstract Closure
with no parameters that captures iterated and predicate and
performs the following steps when called:
Let counter be 0.
Repeat,
Let value be ? IteratorStepValue (iterated ).
If value is done , return ReturnCompletion (undefined ).
Let selected be Completion (Call (predicate ,
undefined , « value , 𝔽 (counter ) »)).
IfAbruptCloseIterator (selected ,
iterated ).
If ToBoolean (selected )
is true , then
Let completion be Completion (Yield (value )).
IfAbruptCloseIterator (completion ,
iterated ).
Set counter to counter + 1.
Let result be CreateIteratorFromClosure (closure ,
"Iterator Helper" , %IteratorHelperPrototype% ,
« [[UnderlyingIterator]] »).
Set result .[[UnderlyingIterator]] to
iterated .
Return result .
27.1.4.5 Iterator.prototype.find ( predicate )
This method performs the following steps when called:
Let O be the this value.
If O is not an Object , throw a
TypeError exception.
Let iterated be the Iterator Record {
[[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }.
If IsCallable (predicate ) is
false , then
Let error be ThrowCompletion (a newly
created TypeError object).
Return ? IteratorClose (iterated ,
error ).
Set iterated to ? GetIteratorDirect (O ).
Let counter be 0.
Repeat,
Let value be ? IteratorStepValue (iterated ).
If value is done , return
undefined .
Let result be Completion (Call (predicate ,
undefined , « value , 𝔽 (counter ) »)).
IfAbruptCloseIterator (result ,
iterated ).
If ToBoolean (result ) is
true , return ? IteratorClose (iterated ,
NormalCompletion (value )).
Set counter to counter + 1.
27.1.4.6 Iterator.prototype.flatMap ( mapper )
This method performs the following steps when called:
Let O be the this value.
If O is not an Object , throw a
TypeError exception.
Let iterated be the Iterator Record {
[[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }.
If IsCallable (mapper ) is
false , then
Let error be ThrowCompletion (a newly
created TypeError object).
Return ? IteratorClose (iterated ,
error ).
Set iterated to ? GetIteratorDirect (O ).
Let closure be a new Abstract Closure
with no parameters that captures iterated and mapper and
performs the following steps when called:
Let counter be 0.
Repeat,
Let value be ? IteratorStepValue (iterated ).
If value is done , return ReturnCompletion (undefined ).
Let mapped be Completion (Call (mapper ,
undefined , « value , 𝔽 (counter ) »)).
IfAbruptCloseIterator (mapped ,
iterated ).
Let innerIterator be Completion (GetIteratorFlattenable (mapped ,
reject-primitives )).
IfAbruptCloseIterator (innerIterator ,
iterated ).
Let innerAlive be true .
Repeat, while innerAlive is true ,
Let innerValue be Completion (IteratorStepValue (innerIterator )).
IfAbruptCloseIterator (innerValue ,
iterated ).
If innerValue is done ,
then
Set innerAlive to
false .
Else,
Let completion be Completion (Yield (innerValue )).
If completion is an abrupt
completion , then
Let backupCompletion be Completion (IteratorClose (innerIterator ,
completion )).
IfAbruptCloseIterator (backupCompletion ,
iterated ).
Return ? IteratorClose (iterated ,
completion ).
Set counter to counter + 1.
Let result be CreateIteratorFromClosure (closure ,
"Iterator Helper" , %IteratorHelperPrototype% ,
« [[UnderlyingIterator]] »).
Set result .[[UnderlyingIterator]] to
iterated .
Return result .
27.1.4.7 Iterator.prototype.forEach ( procedure )
This method performs the following steps when called:
Let O be the this value.
If O is not an Object , throw a
TypeError exception.
Let iterated be the Iterator Record {
[[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }.
If IsCallable (procedure ) is
false , then
Let error be ThrowCompletion (a newly
created TypeError object).
Return ? IteratorClose (iterated ,
error ).
Set iterated to ? GetIteratorDirect (O ).
Let counter be 0.
Repeat,
Let value be ? IteratorStepValue (iterated ).
If value is done , return
undefined .
Let result be Completion (Call (procedure ,
undefined , « value , 𝔽 (counter ) »)).
IfAbruptCloseIterator (result ,
iterated ).
Set counter to counter + 1.
27.1.4.8 Iterator.prototype.map ( mapper )
This method performs the following steps when called:
Let O be the this value.
If O is not an Object , throw a
TypeError exception.
Let iterated be the Iterator Record {
[[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }.
If IsCallable (mapper ) is
false , then
Let error be ThrowCompletion (a newly
created TypeError object).
Return ? IteratorClose (iterated ,
error ).
Set iterated to ? GetIteratorDirect (O ).
Let closure be a new Abstract Closure
with no parameters that captures iterated and mapper and
performs the following steps when called:
Let counter be 0.
Repeat,
Let value be ? IteratorStepValue (iterated ).
If value is done , return ReturnCompletion (undefined ).
Let mapped be Completion (Call (mapper ,
undefined , « value , 𝔽 (counter ) »)).
IfAbruptCloseIterator (mapped ,
iterated ).
Let completion be Completion (Yield (mapped )).
IfAbruptCloseIterator (completion ,
iterated ).
Set counter to counter + 1.
Let result be CreateIteratorFromClosure (closure ,
"Iterator Helper" , %IteratorHelperPrototype% ,
« [[UnderlyingIterator]] »).
Set result .[[UnderlyingIterator]] to
iterated .
Return result .
27.1.4.9 Iterator.prototype.reduce ( reducer [ ,
initialValue ] )
This method performs the following steps when called:
Let O be the this value.
If O is not an Object , throw a
TypeError exception.
Let iterated be the Iterator Record {
[[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }.
If IsCallable (reducer ) is
false , then
Let error be ThrowCompletion (a newly
created TypeError object).
Return ? IteratorClose (iterated ,
error ).
Set iterated to ? GetIteratorDirect (O ).
If initialValue is not present, then
Let accumulator be ? IteratorStepValue (iterated ).
If accumulator is done , throw a
TypeError exception.
Let counter be 1.
Else,
Let accumulator be initialValue .
Let counter be 0.
Repeat,
Let value be ? IteratorStepValue (iterated ).
If value is done , return
accumulator .
Let result be Completion (Call (reducer ,
undefined , « accumulator , value ,
𝔽 (counter ) »)).
IfAbruptCloseIterator (result ,
iterated ).
Set accumulator to result .
Set counter to counter + 1.
27.1.4.10 Iterator.prototype.some ( predicate )
This method performs the following steps when called:
Let O be the this value.
If O is not an Object , throw a
TypeError exception.
Let iterated be the Iterator Record {
[[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }.
If IsCallable (predicate ) is
false , then
Let error be ThrowCompletion (a newly
created TypeError object).
Return ? IteratorClose (iterated ,
error ).
Set iterated to ? GetIteratorDirect (O ).
Let counter be 0.
Repeat,
Let value be ? IteratorStepValue (iterated ).
If value is done , return
false .
Let result be Completion (Call (predicate ,
undefined , « value , 𝔽 (counter ) »)).
IfAbruptCloseIterator (result ,
iterated ).
If ToBoolean (result ) is
true , return ? IteratorClose (iterated ,
NormalCompletion (true )).
Set counter to counter + 1.
27.1.4.11 Iterator.prototype.take ( limit )
This method performs the following steps when called:
Let O be the this value.
If O is not an Object , throw a
TypeError exception.
Let iterated be the Iterator Record {
[[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }.
Let numLimit be Completion (ToNumber (limit )).
IfAbruptCloseIterator (numLimit ,
iterated ).
If numLimit is NaN , then
Let error be ThrowCompletion (a newly
created RangeError object).
Return ? IteratorClose (iterated ,
error ).
Let integerLimit be ! ToIntegerOrInfinity (numLimit ).
If integerLimit < 0, then
Let error be ThrowCompletion (a newly
created RangeError object).
Return ? IteratorClose (iterated ,
error ).
Set iterated to ? GetIteratorDirect (O ).
Let closure be a new Abstract Closure
with no parameters that captures iterated and integerLimit and
performs the following steps when called:
Let remaining be integerLimit .
Repeat,
If remaining = 0, then
Return ? IteratorClose (iterated ,
ReturnCompletion (undefined )).
If remaining ≠ +∞, then
Set remaining to remaining - 1.
Let value be ? IteratorStepValue (iterated ).
If value is done , return ReturnCompletion (undefined ).
Let completion be Completion (Yield (value )).
IfAbruptCloseIterator (completion ,
iterated ).
Let result be CreateIteratorFromClosure (closure ,
"Iterator Helper" , %IteratorHelperPrototype% ,
« [[UnderlyingIterator]] »).
Set result .[[UnderlyingIterator]] to
iterated .
Return result .
27.1.4.12 Iterator.prototype.toArray ( )
This method performs the following steps when called:
Let O be the this value.
If O is not an Object , throw a
TypeError exception.
Let iterated be ? GetIteratorDirect (O ).
Let items be a new empty List .
Repeat,
Let value be ? IteratorStepValue (iterated ).
If value is done , return CreateArrayFromList (items ).
Append value to items .
27.1.4.13 Iterator.prototype [ %Symbol.iterator% ] ( )
This function performs the following steps when called:
Return the this value.
The value of the "name" property of this function is
"[Symbol.iterator]" .
27.1.4.14 Iterator.prototype [ %Symbol.toStringTag% ]
Iterator.prototype[%Symbol.toStringTag%] is an accessor property with
attributes { [[Enumerable]] : false , [[Configurable]] : true }. The [[Get]] and [[Set]] attributes are defined
as follows:
27.1.4.14.1 get Iterator.prototype [ %Symbol.toStringTag% ]
The value of the [[Get]] attribute is a built-in function that
requires no arguments. It performs the following steps when called:
Return "Iterator" .
27.1.4.14.2 set Iterator.prototype [ %Symbol.toStringTag% ]
The value of the [[Set]] attribute is a built-in function that
takes an argument v . It performs the following steps when called:
Perform ? SetterThatIgnoresPrototypeProperties (this
value, %Iterator.prototype% ,
%Symbol.toStringTag% ,
v ).
Return undefined .
Note
Unlike the %Symbol.toStringTag% property
on most built-in prototypes, for web-compatibility reasons this property must be an
accessor.
27.1.5 The %AsyncIteratorPrototype% Object
The %AsyncIteratorPrototype% object:
Note
All objects defined in this specification that implement the async iterator interface also
inherit from %AsyncIteratorPrototype%. ECMAScript code may also define objects that
inherit from %AsyncIteratorPrototype%. The %AsyncIteratorPrototype% object provides a
place where additional methods that are applicable to all async iterator objects may be
added.
27.1.5.1 %AsyncIteratorPrototype% [ %Symbol.asyncIterator% ] ( )
This function performs the following steps when called:
Return the this value.
The value of the "name" property of this function is
"[Symbol.asyncIterator]" .
27.1.6 Async-from-Sync Iterator Objects
An Async-from-Sync Iterator
object is an async iterator that adapts a specific
synchronous iterator . Async-from-Sync Iterator objects
are never directly accessible to ECMAScript code. There is not a named constructor for
Async-from-Sync Iterator objects. Instead, Async-from-Sync Iterator objects are created by the
CreateAsyncFromSyncIterator
abstract operation as needed.
27.1.6.1 CreateAsyncFromSyncIterator (
syncIteratorRecord )
The abstract operation CreateAsyncFromSyncIterator takes argument
syncIteratorRecord (an Iterator Record ) and returns an
Iterator Record . It is used to create an
async Iterator Record from a synchronous
Iterator Record . It performs the
following steps when called:
Let asyncIterator be OrdinaryObjectCreate (%AsyncFromSyncIteratorPrototype% ,
« [[SyncIteratorRecord]] »).
Set asyncIterator .[[SyncIteratorRecord]] to
syncIteratorRecord .
Let nextMethod be ! Get (asyncIterator ,
"next" ).
Let iteratorRecord be the Iterator Record {
[[Iterator]] : asyncIterator , [[NextMethod]] : nextMethod , [[Done]] : false }.
Return iteratorRecord .
27.1.6.2 The %AsyncFromSyncIteratorPrototype% Object
The %AsyncFromSyncIteratorPrototype% object:
27.1.6.2.1 %AsyncFromSyncIteratorPrototype%.next ( [
value ] )
Let O be the this value.
Assert : O is an
Object that has a [[SyncIteratorRecord]] internal slot.
Let promiseCapability be ! NewPromiseCapability (%Promise% ).
Let syncIteratorRecord be O .[[SyncIteratorRecord]] .
If value is present, then
Let result be Completion (IteratorNext (syncIteratorRecord ,
value )).
Else,
Let result be Completion (IteratorNext (syncIteratorRecord )).
IfAbruptRejectPromise (result ,
promiseCapability ).
Return AsyncFromSyncIteratorContinuation (result ,
promiseCapability , syncIteratorRecord ,
true ).
27.1.6.2.2 %AsyncFromSyncIteratorPrototype%.return ( [
value ] )
Let O be the this value.
Assert : O is an
Object that has a [[SyncIteratorRecord]] internal slot.
Let promiseCapability be ! NewPromiseCapability (%Promise% ).
Let syncIteratorRecord be O .[[SyncIteratorRecord]] .
Let syncIterator be syncIteratorRecord .[[Iterator]] .
Let return be Completion (GetMethod (syncIterator ,
"return" )).
IfAbruptRejectPromise (return ,
promiseCapability ).
If return is undefined , then
Let iteratorResult be CreateIteratorResultObject (value ,
true ).
Perform ! Call (promiseCapability .[[Resolve]] , undefined , «
iteratorResult »).
Return promiseCapability .[[Promise]] .
If value is present, then
Let result be Completion (Call (return ,
syncIterator , « value »)).
Else,
Let result be Completion (Call (return ,
syncIterator )).
IfAbruptRejectPromise (result ,
promiseCapability ).
If result is not an Object , then
Perform ! Call (promiseCapability .[[Reject]] , undefined , « a
newly created TypeError object »).
Return promiseCapability .[[Promise]] .
Return AsyncFromSyncIteratorContinuation (result ,
promiseCapability , syncIteratorRecord ,
false ).
27.1.6.2.3 %AsyncFromSyncIteratorPrototype%.throw ( [
value ] )
Note
In this specification,
value is always provided,
but is left optional for consistency with
%AsyncFromSyncIteratorPrototype%.return
( [ value ] ) .
Let O be the this value.
Assert : O is an
Object that has a [[SyncIteratorRecord]] internal slot.
Let promiseCapability be ! NewPromiseCapability (%Promise% ).
Let syncIteratorRecord be O .[[SyncIteratorRecord]] .
Let syncIterator be syncIteratorRecord .[[Iterator]] .
Let throw be Completion (GetMethod (syncIterator ,
"throw" )).
IfAbruptRejectPromise (throw ,
promiseCapability ).
If throw is undefined , then
NOTE: If syncIterator does not have a throw
method, close it to give it a chance to clean up before we reject the
capability.
Let closeCompletion be NormalCompletion (empty ).
Let result be Completion (IteratorClose (syncIteratorRecord ,
closeCompletion )).
IfAbruptRejectPromise (result ,
promiseCapability ).
NOTE: The next step throws a TypeError to indicate
that there was a protocol violation: syncIterator does not
have a throw method.
NOTE: If closing syncIterator does not throw then the result
of that operation is ignored, even if it yields a rejected promise.
Perform ! Call (promiseCapability .[[Reject]] , undefined , « a
newly created TypeError object »).
Return promiseCapability .[[Promise]] .
If value is present, then
Let result be Completion (Call (throw ,
syncIterator , « value »)).
Else,
Let result be Completion (Call (throw ,
syncIterator )).
IfAbruptRejectPromise (result ,
promiseCapability ).
If result is not an Object , then
Perform ! Call (promiseCapability .[[Reject]] , undefined , « a
newly created TypeError object »).
Return promiseCapability .[[Promise]] .
Return AsyncFromSyncIteratorContinuation (result ,
promiseCapability , syncIteratorRecord ,
true ).
27.1.6.3 Properties of Async-from-Sync Iterator Instances
Async-from-Sync Iterator instances are ordinary
objects that inherit properties from the %AsyncFromSyncIteratorPrototype%
intrinsic object. Async-from-Sync Iterator instances are
initially created with the internal slots listed in Table 89 .
Table 89: Internal Slots of Async-from-Sync Iterator Instances
Internal Slot
Type
Description
[[SyncIteratorRecord]]
an Iterator Record
Represents the original synchronous iterator which is
being adapted.
27.1.6.4 AsyncFromSyncIteratorContinuation ( result ,
promiseCapability , syncIteratorRecord , closeOnRejection )
The abstract operation AsyncFromSyncIteratorContinuation takes arguments result
(an Object), promiseCapability (a PromiseCapability
Record for an intrinsic %Promise% ),
syncIteratorRecord (an Iterator Record ), and
closeOnRejection (a Boolean) and returns a Promise. It performs the following
steps when called:
NOTE: Because promiseCapability is derived from the intrinsic %Promise% , the calls to
promiseCapability .[[Reject]] entailed by the use
IfAbruptRejectPromise below
are guaranteed not to throw.
Let done be Completion (IteratorComplete (result )).
IfAbruptRejectPromise (done ,
promiseCapability ).
Let value be Completion (IteratorValue (result )).
IfAbruptRejectPromise (value ,
promiseCapability ).
Let valueWrapper be Completion (PromiseResolve (%Promise% ,
value )).
If valueWrapper is an abrupt
completion , done is false , and
closeOnRejection is true , then
Set valueWrapper to Completion (IteratorClose (syncIteratorRecord ,
valueWrapper )).
IfAbruptRejectPromise (valueWrapper ,
promiseCapability ).
Let unwrap be a new Abstract Closure
with parameters (v ) that captures done and performs the
following steps when called:
Return CreateIteratorResultObject (v ,
done ).
Let onFulfilled be CreateBuiltinFunction (unwrap ,
1, "" , « »).
NOTE: onFulfilled is used when processing the "value"
property of an IteratorResult object in
order to wait for its value if it is a promise and re-package the result in a new
"unwrapped" IteratorResult object .
If done is true , or if closeOnRejection is
false , then
Let onRejected be undefined .
Else,
Let closeIterator be a new Abstract
Closure with parameters (error ) that
captures syncIteratorRecord and performs the following steps when
called:
Return ? IteratorClose (syncIteratorRecord ,
ThrowCompletion (error )).
Let onRejected be CreateBuiltinFunction (closeIterator ,
1, "" , « »).
NOTE: onRejected is used to close the Iterator when the
"value" property of an IteratorResult
object it yields is a rejected promise.
Perform PerformPromiseThen (valueWrapper ,
onFulfilled , onRejected , promiseCapability ).
Return promiseCapability .[[Promise]] .
27.2 Promise Objects
A Promise is an object that is used as a placeholder for the eventual results of a deferred (and
possibly asynchronous) computation.
Any Promise is in one of three mutually exclusive states: fulfilled , rejected , and
pending :
A promise p is fulfilled if p.then(f, r) will immediately enqueue a
Job to call the function
f.
A promise p is rejected if p.then(f, r) will immediately enqueue a
Job to call the function
r.
A promise is pending if it is neither fulfilled nor rejected.
A promise is said to be settled if it is not pending, i.e. if it is either fulfilled or
rejected.
A promise is resolved if it is settled or if it has been “locked in” to match the state of
another promise. Attempting to resolve or reject a resolved promise has no effect. A promise is
unresolved if it is not resolved. An unresolved promise is always in the pending state. A
resolved promise may be pending, fulfilled or rejected.
27.2.1 Promise Abstract Operations
27.2.1.1 PromiseCapability Records
A PromiseCapability Record is a
Record value used to
encapsulate a Promise or promise-like object along with the functions that are capable of
resolving or rejecting that promise. PromiseCapability Records are produced by the NewPromiseCapability abstract
operation.
PromiseCapability Records have the fields listed in Table 90 .
Table 90: PromiseCapability
Record Fields
Field Name
Value
Meaning
[[Promise]]
an Object
An object that is usable as a promise.
[[Resolve]]
a function object
The function that is used to resolve the given promise.
[[Reject]]
a function object
The function that is used to reject the given promise.
27.2.1.1.1 IfAbruptRejectPromise ( value ,
capability )
IfAbruptRejectPromise is a shorthand for a sequence of algorithm steps that use a
PromiseCapability Record .
An algorithm step of the form:
IfAbruptRejectPromise (value ,
capability ).
means the same thing as:
Assert : value is a Completion
Record .
If value is an abrupt
completion , then
Perform ? Call (capability .[[Reject]] , undefined , «
value .[[Value]] »).
Return capability .[[Promise]] .
Else,
Set value to ! value .
27.2.1.2 PromiseReaction Records
A PromiseReaction Record is a
Record value used to
store information about how a promise should react when it becomes resolved or rejected with
a given value. PromiseReaction Records are created by the PerformPromiseThen abstract operation,
and are used by the Abstract Closure returned by NewPromiseReactionJob .
PromiseReaction Records have the fields listed in Table 91 .
Table 91: PromiseReaction Record
Fields
Field Name
Value
Meaning
[[Capability]]
a PromiseCapability
Record or undefined
The capabilities of the promise for which this record provides a
reaction handler.
[[Type]]
fulfill or reject
The [[Type]] is used when [[Handler]] is empty to
allow for behaviour specific to the settlement type.
[[Handler]]
a JobCallback
Record or empty
The function that should be applied to the incoming value, and whose
return value will govern what happens to the derived promise. If [[Handler]] is empty , a
function that depends on the value of [[Type]]
will be used instead.
27.2.1.3 CreateResolvingFunctions ( promise )
The abstract operation CreateResolvingFunctions takes argument promise (a Promise)
and returns a Record with fields
[[Resolve]] (a function object ) and [[Reject]] (a function object ). It performs the following
steps when called:
Let alreadyResolved be the Record { [[Value]] : false }.
Let stepsResolve be the algorithm steps defined in Promise Resolve
Functions .
Let lengthResolve be the number of non-optional parameters of the
function definition in Promise Resolve
Functions .
Let resolve be CreateBuiltinFunction (stepsResolve ,
lengthResolve , "" , « [[Promise]] , [[AlreadyResolved]] »).
Set resolve .[[Promise]] to promise .
Set resolve .[[AlreadyResolved]] to
alreadyResolved .
Let stepsReject be the algorithm steps defined in Promise Reject
Functions .
Let lengthReject be the number of non-optional parameters of the function
definition in Promise Reject
Functions .
Let reject be CreateBuiltinFunction (stepsReject ,
lengthReject , "" , « [[Promise]] , [[AlreadyResolved]] »).
Set reject .[[Promise]] to promise .
Set reject .[[AlreadyResolved]] to
alreadyResolved .
Return the Record { [[Resolve]] : resolve , [[Reject]] : reject }.
27.2.1.3.1 Promise Reject Functions
A promise reject function is an anonymous built-in function that has [[Promise]] and [[AlreadyResolved]]
internal slots.
When a promise reject function is called with argument reason , the following
steps are taken:
Let F be the active function
object .
Assert : F has a [[Promise]] internal slot whose value is an
Object .
Let promise be F .[[Promise]] .
Let alreadyResolved be F .[[AlreadyResolved]] .
If alreadyResolved .[[Value]] is
true , return undefined .
Set alreadyResolved .[[Value]] to
true .
Perform RejectPromise (promise ,
reason ).
Return undefined .
The "length" property of a promise reject function is
1 𝔽 .
27.2.1.3.2 Promise Resolve Functions
A promise resolve function is an anonymous built-in function that has [[Promise]] and [[AlreadyResolved]]
internal slots.
When a promise resolve function is called with argument resolution , the
following steps are taken:
Let F be the active function
object .
Assert : F has a [[Promise]] internal slot whose value is an
Object .
Let promise be F .[[Promise]] .
Let alreadyResolved be F .[[AlreadyResolved]] .
If alreadyResolved .[[Value]] is
true , return undefined .
Set alreadyResolved .[[Value]] to
true .
If SameValue (resolution ,
promise ) is true , then
Let selfResolutionError be a newly created
TypeError object.
Perform RejectPromise (promise ,
selfResolutionError ).
Return undefined .
If resolution is not an Object , then
Perform FulfillPromise (promise ,
resolution ).
Return undefined .
Let then be Completion (Get (resolution ,
"then" )).
If then is an abrupt
completion , then
Perform RejectPromise (promise ,
then .[[Value]] ).
Return undefined .
Let thenAction be then .[[Value]] .
If IsCallable (thenAction )
is false , then
Perform FulfillPromise (promise ,
resolution ).
Return undefined .
Let thenJobCallback be HostMakeJobCallback (thenAction ).
Let job be NewPromiseResolveThenableJob (promise ,
resolution , thenJobCallback ).
Perform HostEnqueuePromiseJob (job .[[Job]] , job .[[Realm]] ).
Return undefined .
The "length" property of a promise resolve function is
1 𝔽 .
27.2.1.4 FulfillPromise ( promise , value )
The abstract operation FulfillPromise takes arguments promise (a Promise) and
value (an ECMAScript language value ) and
returns unused . It performs the following steps when called:
Assert :
promise .[[PromiseState]] is
pending .
Let reactions be promise .[[PromiseFulfillReactions]] .
Set promise .[[PromiseResult]] to
value .
Set promise .[[PromiseFulfillReactions]] to
undefined .
Set promise .[[PromiseRejectReactions]] to
undefined .
Set promise .[[PromiseState]] to
fulfilled .
Perform TriggerPromiseReactions (reactions ,
value ).
Return unused .
27.2.1.5 NewPromiseCapability ( C )
The abstract operation NewPromiseCapability takes argument C (an ECMAScript language value ) and
returns either a normal completion
containing a PromiseCapability
Record or a throw completion . It
attempts to use C as a constructor in the fashion of the built-in
Promise constructor to create a promise and extract its
resolve and reject functions. The promise plus the
resolve and reject functions are used to initialize a new
PromiseCapability Record . It
performs the following steps when called:
If IsConstructor (C ) is
false , throw a TypeError exception.
NOTE: C is assumed to be a constructor function that
supports the parameter conventions of the Promise constructor (see 27.2.3.1 ).
Let resolvingFunctions be the Record { [[Resolve]] : undefined , [[Reject]] : undefined }.
Let executorClosure be a new Abstract Closure
with parameters (resolve , reject ) that captures
resolvingFunctions and performs the following steps when called:
If resolvingFunctions .[[Resolve]] is not
undefined , throw a TypeError
exception.
If resolvingFunctions .[[Reject]] is not
undefined , throw a TypeError
exception.
Set resolvingFunctions .[[Resolve]] to
resolve .
Set resolvingFunctions .[[Reject]] to
reject .
Return NormalCompletion (undefined ).
Let executor be CreateBuiltinFunction (executorClosure ,
2, "" , « »).
Let promise be ? Construct (C , «
executor »).
If IsCallable (resolvingFunctions .[[Resolve]] ) is false , throw a
TypeError exception.
If IsCallable (resolvingFunctions .[[Reject]] ) is false , throw a
TypeError exception.
Return the PromiseCapability
Record { [[Promise]] :
promise , [[Resolve]] :
resolvingFunctions .[[Resolve]] , [[Reject]] : resolvingFunctions .[[Reject]] }.
Note
This abstract operation supports Promise subclassing, as it is generic on any
constructor that calls a passed executor
function argument in the same way as the Promise constructor . It is used to
generalize static methods of the Promise constructor to any
subclass.
27.2.1.6 IsPromise ( x )
The abstract operation IsPromise takes argument x (an ECMAScript language value ) and
returns a Boolean. It checks for the promise brand on an object. It performs the following
steps when called:
If x is not an Object , return
false .
If x does not have a [[PromiseState]] internal
slot, return false .
Return true .
27.2.1.7 RejectPromise ( promise , reason )
The abstract operation RejectPromise takes arguments promise (a Promise) and
reason (an ECMAScript language value ) and
returns unused . It performs the following steps when called:
Assert :
promise .[[PromiseState]] is
pending .
Let reactions be promise .[[PromiseRejectReactions]] .
Set promise .[[PromiseResult]] to
reason .
Set promise .[[PromiseFulfillReactions]] to
undefined .
Set promise .[[PromiseRejectReactions]] to
undefined .
Set promise .[[PromiseState]] to
rejected .
If promise .[[PromiseIsHandled]] is
false , perform HostPromiseRejectionTracker (promise ,
"reject" ).
Perform TriggerPromiseReactions (reactions ,
reason ).
Return unused .
27.2.1.8 TriggerPromiseReactions ( reactions ,
argument )
The abstract operation TriggerPromiseReactions takes arguments reactions (a
List of PromiseReaction Records ) and
argument (an ECMAScript language value ) and
returns unused . It enqueues a new Job for each record in
reactions . Each such Job processes the [[Type]] and
[[Handler]] of the PromiseReaction
Record , and if the [[Handler]] is not
empty , calls it passing the given argument. If the [[Handler]] is empty , the behaviour is
determined by the [[Type]] . It performs the following steps when
called:
For each element reaction of reactions , do
Let job be NewPromiseReactionJob (reaction ,
argument ).
Perform HostEnqueuePromiseJob (job .[[Job]] , job .[[Realm]] ).
Return unused .
27.2.1.9 HostPromiseRejectionTracker ( promise ,
operation )
The host-defined abstract operation
HostPromiseRejectionTracker takes arguments promise (a Promise) and
operation ("reject" or "handle" ) and
returns unused . It allows host environments to track
promise rejections.
The default implementation of HostPromiseRejectionTracker is to return
unused .
Note 1
HostPromiseRejectionTracker is called in two scenarios:
When a promise is rejected without any handlers, it is called with its
operation argument set to "reject" .
When a handler is added to a rejected promise for the first time, it is called
with its operation argument set to "handle" .
A typical implementation of HostPromiseRejectionTracker might try to notify
developers of unhandled rejections, while also being careful to notify them if such
previous notifications are later invalidated by new handlers being attached.
Note 2
If operation is "handle" , an implementation should not
hold a reference to promise in a way that would interfere with garbage
collection. An implementation may hold a reference to promise if
operation is "reject" , since it is expected that
rejections will be rare and not on hot code paths.
27.2.2 Promise Jobs
27.2.2.1 NewPromiseReactionJob ( reaction ,
argument )
The abstract operation NewPromiseReactionJob takes arguments reaction (a PromiseReaction Record ) and
argument (an ECMAScript language value ) and
returns a Record with fields
[[Job]] (a Job Abstract Closure ) and
[[Realm]] (a Realm Record or null ). It
returns a new Job
Abstract Closure that applies the
appropriate handler to the incoming value, and uses the handler's return value to resolve or
reject the derived promise associated with that handler. It performs the following steps
when called:
Let job be a new Job Abstract Closure
with no parameters that captures reaction and argument and
performs the following steps when called:
Let promiseCapability be reaction .[[Capability]] .
Let type be reaction .[[Type]] .
Let handler be reaction .[[Handler]] .
If handler is empty , then
If type is fulfill , then
Let handlerResult be NormalCompletion (argument ).
Else,
Assert :
type is reject .
Let handlerResult be ThrowCompletion (argument ).
Else,
Let handlerResult be Completion (HostCallJobCallback (handler ,
undefined , « argument »)).
If promiseCapability is undefined , then
Assert :
handlerResult is not an abrupt
completion .
Return empty .
Assert : promiseCapability
is a PromiseCapability
Record .
If handlerResult is an abrupt
completion , then
Return ? Call (promiseCapability .[[Reject]] , undefined , «
handlerResult .[[Value]] »).
Else,
Return ? Call (promiseCapability .[[Resolve]] , undefined , «
handlerResult .[[Value]] »).
Let handlerRealm be null .
If reaction .[[Handler]] is not
empty , then
Let getHandlerRealmResult be Completion (GetFunctionRealm (reaction .[[Handler]] .[[Callback]] )).
If getHandlerRealmResult is a normal
completion , set handlerRealm to
getHandlerRealmResult .[[Value]] .
Else, set handlerRealm to the current Realm
Record .
NOTE: handlerRealm is never null unless the
handler is undefined . When the handler is a revoked Proxy
and no ECMAScript code runs, handlerRealm is used to create error
objects.
Return the Record { [[Job]] : job , [[Realm]] :
handlerRealm }.
27.2.2.2 NewPromiseResolveThenableJob (
promiseToResolve , thenable , then )
The abstract operation NewPromiseResolveThenableJob takes arguments
promiseToResolve (a Promise), thenable (an Object), and
then (a JobCallback Record ) and returns a
Record with fields
[[Job]] (a Job Abstract Closure ) and
[[Realm]] (a Realm Record ). It performs the following steps
when called:
Let job be a new Job Abstract Closure
with no parameters that captures promiseToResolve , thenable ,
and then and performs the following steps when called:
Let resolvingFunctions be CreateResolvingFunctions (promiseToResolve ).
Let thenCallResult be Completion (HostCallJobCallback (then ,
thenable , « resolvingFunctions .[[Resolve]] , resolvingFunctions .[[Reject]] »)).
If thenCallResult is an abrupt
completion , then
Return ? Call (resolvingFunctions .[[Reject]] , undefined , «
thenCallResult .[[Value]] »).
Return ! thenCallResult .
Let getThenRealmResult be Completion (GetFunctionRealm (then .[[Callback]] )).
If getThenRealmResult is a normal
completion , let thenRealm be
getThenRealmResult .[[Value]] .
Else, let thenRealm be the current Realm Record .
NOTE: thenRealm is never null . When
then .[[Callback]] is a revoked Proxy and no code
runs, thenRealm is used to create error objects.
Return the Record { [[Job]] : job , [[Realm]] :
thenRealm }.
Note
This Job uses the
supplied thenable and its then method to resolve the given promise.
This process must take place as a Job to ensure that the evaluation of the
then method occurs after evaluation of any surrounding code has
completed.
27.2.3 The Promise Constructor
The Promise constructor :
is %Promise% .
is the initial value of the "Promise" property of the global
object .
creates and initializes a new Promise when called as a constructor .
is not intended to be called as a function and will throw an exception when called in that
manner.
may be used as the value in an extends clause of a class definition. Subclass
constructors that intend to inherit the specified
Promise behaviour must include a super call to the Promise constructor to
create and initialize the subclass instance with the internal state necessary to support the
Promise and Promise.prototype built-in methods.
27.2.3.1 Promise ( executor )
This function performs the following steps when called:
If NewTarget is undefined , throw a TypeError
exception.
If IsCallable (executor ) is
false , throw a TypeError exception.
Let promise be ? OrdinaryCreateFromConstructor (NewTarget,
"%Promise.prototype%" , « [[PromiseState]] , [[PromiseResult]] , [[PromiseFulfillReactions]] , [[PromiseRejectReactions]] , [[PromiseIsHandled]] »).
Set promise .[[PromiseState]] to
pending .
Set promise .[[PromiseResult]] to
empty .
Set promise .[[PromiseFulfillReactions]] to a new
empty List .
Set promise .[[PromiseRejectReactions]] to a new
empty List .
Set promise .[[PromiseIsHandled]] to
false .
Let resolvingFunctions be CreateResolvingFunctions (promise ).
Let completion be Completion (Call (executor ,
undefined , « resolvingFunctions .[[Resolve]] , resolvingFunctions .[[Reject]] »)).
If completion is an abrupt
completion , then
Perform ? Call (resolvingFunctions .[[Reject]] , undefined , «
completion .[[Value]] »).
Return promise .
Note
The executor argument must be a function object . It is
called for initiating and reporting completion of the possibly deferred action
represented by this Promise. The executor is called with two arguments:
resolve and reject . These are functions that may be used by
the executor function to report eventual completion or failure of the
deferred computation. Returning from the executor function does not mean that the
deferred action has been completed but only that the request to eventually perform
the deferred action has been accepted.
The resolve function that is passed to an executor function
accepts a single argument. The executor code may eventually call the
resolve function to indicate that it wishes to resolve the associated
Promise. The argument passed to the resolve function represents the
eventual value of the deferred action and can be either the actual fulfillment value
or another promise which will provide the value if it is fulfilled.
The reject function that is passed to an executor function
accepts a single argument. The executor code may eventually call the
reject function to indicate that the associated Promise is rejected and
will never be fulfilled. The argument passed to the reject function is
used as the rejection value of the promise. Typically it will be an Error object.
The resolve and reject functions passed to an executor function by the
Promise constructor have the capability to
actually resolve and reject the associated promise. Subclasses may have different
constructor behaviour that passes in
customized values for resolve and reject.
27.2.4 Properties of the Promise Constructor
The Promise constructor :
has a [[Prototype]] internal slot whose value is %Function.prototype% .
has the following properties:
27.2.4.1 Promise.all ( iterable )
This function returns a new promise which is fulfilled with an array of fulfillment values
for the passed promises, or rejects with the reason of the first passed promise that
rejects. It resolves all elements of the passed iterable to promises as
it runs this algorithm.
Let C be the this value.
Let promiseCapability be ? NewPromiseCapability (C ).
Let promiseResolve be Completion (GetPromiseResolve (C )).
IfAbruptRejectPromise (promiseResolve ,
promiseCapability ).
Let iteratorRecord be Completion (GetIterator (iterable ,
sync )).
IfAbruptRejectPromise (iteratorRecord ,
promiseCapability ).
Let result be Completion (PerformPromiseAll (iteratorRecord ,
C , promiseCapability , promiseResolve )).
If result is an abrupt
completion , then
If iteratorRecord .[[Done]] is
false , set result to Completion (IteratorClose (iteratorRecord ,
result )).
IfAbruptRejectPromise (result ,
promiseCapability ).
Return ! result .
Note
This function requires its this value to be a constructor function that supports the
parameter conventions of the Promise constructor .
27.2.4.1.1 GetPromiseResolve ( promiseConstructor
)
The abstract operation GetPromiseResolve takes argument promiseConstructor (a
constructor ) and returns either a normal completion
containing a function object or a throw
completion . It performs the following steps when called:
Let promiseResolve be ? Get (promiseConstructor ,
"resolve" ).
If IsCallable (promiseResolve )
is false , throw a TypeError exception.
Return promiseResolve .
27.2.4.1.2 PerformPromiseAll ( iteratorRecord ,
constructor , resultCapability , promiseResolve )
The abstract operation PerformPromiseAll takes arguments iteratorRecord (an
Iterator Record ),
constructor (a constructor ), resultCapability (a
PromiseCapability Record ),
and promiseResolve (a function object ) and returns either a
normal completion
containing an ECMAScript language
value or a throw
completion . It performs the following steps when called:
Let values be a new empty List .
Let remainingElementsCount be the Record {
[[Value]] : 1 }.
Let index be 0.
Repeat,
Let next be ? IteratorStepValue (iteratorRecord ).
If next is done , then
Set remainingElementsCount .[[Value]] to
remainingElementsCount .[[Value]] - 1.
If remainingElementsCount .[[Value]] = 0, then
Let valuesArray be CreateArrayFromList (values ).
Perform ? Call (resultCapability .[[Resolve]] ,
undefined , «
valuesArray »).
Return resultCapability .[[Promise]] .
Append undefined to values .
Let nextPromise be ? Call (promiseResolve ,
constructor , « next »).
Let steps be the algorithm steps defined in Promise.all
Resolve Element Functions .
Let length be the number of non-optional parameters of the
function definition in Promise.all
Resolve Element Functions .
Let onFulfilled be CreateBuiltinFunction (steps ,
length , "" , « [[AlreadyCalled]] , [[Index]] , [[Values]] ,
[[Capability]] , [[RemainingElements]] »).
Set onFulfilled .[[AlreadyCalled]] to
false .
Set onFulfilled .[[Index]] to
index .
Set onFulfilled .[[Values]] to
values .
Set onFulfilled .[[Capability]] to
resultCapability .
Set onFulfilled .[[RemainingElements]] to
remainingElementsCount .
Set remainingElementsCount .[[Value]]
to remainingElementsCount .[[Value]]
+ 1.
Perform ? Invoke (nextPromise ,
"then" , « onFulfilled ,
resultCapability .[[Reject]] »).
Set index to index + 1.
27.2.4.1.3 Promise.all Resolve Element
Functions
A Promise.all resolve element function is an anonymous built-in function
that is used to resolve a specific Promise.all element. Each
Promise.all resolve element function has [[Index]] , [[Values]] , [[Capability]] , [[RemainingElements]] ,
and [[AlreadyCalled]] internal slots.
When a Promise.all resolve element function is called with argument
x , the following steps are taken:
Let F be the active function
object .
If F .[[AlreadyCalled]] is
true , return undefined .
Set F .[[AlreadyCalled]] to
true .
Let index be F .[[Index]] .
Let values be F .[[Values]] .
Let promiseCapability be F .[[Capability]] .
Let remainingElementsCount be F .[[RemainingElements]] .
Set values [index ] to x .
Set remainingElementsCount .[[Value]] to
remainingElementsCount .[[Value]] - 1.
If remainingElementsCount .[[Value]] = 0,
then
Let valuesArray be CreateArrayFromList (values ).
Return ? Call (promiseCapability .[[Resolve]] , undefined , «
valuesArray »).
Return undefined .
The "length" property of a Promise.all resolve element
function is 1 𝔽 .
27.2.4.2 Promise.allSettled ( iterable )
This function returns a promise that is fulfilled with an array of promise state snapshots,
but only after all the original promises have settled, i.e. become either fulfilled or
rejected. It resolves all elements of the passed iterable to promises as
it runs this algorithm.
Let C be the this value.
Let promiseCapability be ? NewPromiseCapability (C ).
Let promiseResolve be Completion (GetPromiseResolve (C )).
IfAbruptRejectPromise (promiseResolve ,
promiseCapability ).
Let iteratorRecord be Completion (GetIterator (iterable ,
sync )).
IfAbruptRejectPromise (iteratorRecord ,
promiseCapability ).
Let result be Completion (PerformPromiseAllSettled (iteratorRecord ,
C , promiseCapability , promiseResolve )).
If result is an abrupt
completion , then
If iteratorRecord .[[Done]] is
false , set result to Completion (IteratorClose (iteratorRecord ,
result )).
IfAbruptRejectPromise (result ,
promiseCapability ).
Return ! result .
Note
This function requires its this value to be a constructor function that supports the
parameter conventions of the Promise constructor .
27.2.4.2.1 PerformPromiseAllSettled (
iteratorRecord , constructor , resultCapability ,
promiseResolve )
The abstract operation PerformPromiseAllSettled takes arguments iteratorRecord
(an Iterator Record ),
constructor (a constructor ), resultCapability (a
PromiseCapability Record ),
and promiseResolve (a function object ) and returns either a
normal completion
containing an ECMAScript language
value or a throw
completion . It performs the following steps when called:
Let values be a new empty List .
Let remainingElementsCount be the Record {
[[Value]] : 1 }.
Let index be 0.
Repeat,
Let next be ? IteratorStepValue (iteratorRecord ).
If next is done , then
Set remainingElementsCount .[[Value]] to
remainingElementsCount .[[Value]] - 1.
If remainingElementsCount .[[Value]] = 0, then
Let valuesArray be CreateArrayFromList (values ).
Perform ? Call (resultCapability .[[Resolve]] ,
undefined , «
valuesArray »).
Return resultCapability .[[Promise]] .
Append undefined to values .
Let nextPromise be ? Call (promiseResolve ,
constructor , « next »).
Let stepsFulfilled be the algorithm steps defined in
Promise.allSettled
Resolve Element Functions .
Let lengthFulfilled be the number of non-optional parameters
of the function definition in Promise.allSettled
Resolve Element Functions .
Let onFulfilled be CreateBuiltinFunction (stepsFulfilled ,
lengthFulfilled , "" , « [[AlreadyCalled]] , [[Index]] , [[Values]] ,
[[Capability]] , [[RemainingElements]] »).
Let alreadyCalled be the Record
{ [[Value]] : false }.
Set onFulfilled .[[AlreadyCalled]] to
alreadyCalled .
Set onFulfilled .[[Index]] to
index .
Set onFulfilled .[[Values]] to
values .
Set onFulfilled .[[Capability]] to
resultCapability .
Set onFulfilled .[[RemainingElements]] to
remainingElementsCount .
Let stepsRejected be the algorithm steps defined in Promise.allSettled
Reject Element Functions .
Let lengthRejected be the number of non-optional parameters
of the function definition in Promise.allSettled
Reject Element Functions .
Let onRejected be CreateBuiltinFunction (stepsRejected ,
lengthRejected , "" , « [[AlreadyCalled]] , [[Index]] , [[Values]] ,
[[Capability]] , [[RemainingElements]] »).
Set onRejected .[[AlreadyCalled]] to
alreadyCalled .
Set onRejected .[[Index]] to
index .
Set onRejected .[[Values]] to
values .
Set onRejected .[[Capability]] to
resultCapability .
Set onRejected .[[RemainingElements]]
to remainingElementsCount .
Set remainingElementsCount .[[Value]]
to remainingElementsCount .[[Value]]
+ 1.
Perform ? Invoke (nextPromise ,
"then" , « onFulfilled ,
onRejected »).
Set index to index + 1.
27.2.4.2.2 Promise.allSettled Resolve Element
Functions
A Promise.allSettled resolve element function is an anonymous built-in
function that is used to resolve a specific Promise.allSettled element.
Each Promise.allSettled resolve element function has [[Index]] , [[Values]] , [[Capability]] , [[RemainingElements]] ,
and [[AlreadyCalled]] internal slots.
When a Promise.allSettled resolve element function is called with argument
x , the following steps are taken:
Let F be the active function
object .
Let alreadyCalled be F .[[AlreadyCalled]] .
If alreadyCalled .[[Value]] is
true , return undefined .
Set alreadyCalled .[[Value]] to
true .
Let index be F .[[Index]] .
Let values be F .[[Values]] .
Let promiseCapability be F .[[Capability]] .
Let remainingElementsCount be F .[[RemainingElements]] .
Let obj be OrdinaryObjectCreate (%Object.prototype% ).
Perform ! CreateDataPropertyOrThrow (obj ,
"status" , "fulfilled" ).
Perform ! CreateDataPropertyOrThrow (obj ,
"value" , x ).
Set values [index ] to obj .
Set remainingElementsCount .[[Value]] to
remainingElementsCount .[[Value]] - 1.
If remainingElementsCount .[[Value]] = 0,
then
Let valuesArray be CreateArrayFromList (values ).
Return ? Call (promiseCapability .[[Resolve]] , undefined , «
valuesArray »).
Return undefined .
The "length" property of a Promise.allSettled resolve
element function is 1 𝔽 .
27.2.4.2.3 Promise.allSettled Reject Element
Functions
A Promise.allSettled reject element function is an anonymous built-in
function that is used to reject a specific Promise.allSettled element. Each
Promise.allSettled reject element function has [[Index]] , [[Values]] , [[Capability]] , [[RemainingElements]] ,
and [[AlreadyCalled]] internal slots.
When a Promise.allSettled reject element function is called with argument
x , the following steps are taken:
Let F be the active function
object .
Let alreadyCalled be F .[[AlreadyCalled]] .
If alreadyCalled .[[Value]] is
true , return undefined .
Set alreadyCalled .[[Value]] to
true .
Let index be F .[[Index]] .
Let values be F .[[Values]] .
Let promiseCapability be F .[[Capability]] .
Let remainingElementsCount be F .[[RemainingElements]] .
Let obj be OrdinaryObjectCreate (%Object.prototype% ).
Perform ! CreateDataPropertyOrThrow (obj ,
"status" , "rejected" ).
Perform ! CreateDataPropertyOrThrow (obj ,
"reason" , x ).
Set values [index ] to obj .
Set remainingElementsCount .[[Value]] to
remainingElementsCount .[[Value]] - 1.
If remainingElementsCount .[[Value]] = 0,
then
Let valuesArray be CreateArrayFromList (values ).
Return ? Call (promiseCapability .[[Resolve]] , undefined , «
valuesArray »).
Return undefined .
The "length" property of a Promise.allSettled reject
element function is 1 𝔽 .
27.2.4.3 Promise.any ( iterable )
This function returns a promise that is fulfilled by the first given promise to be fulfilled,
or rejected with an AggregateError holding the rejection reasons if all of the
given promises are rejected. It resolves all elements of the passed iterable to promises as it runs this
algorithm.
Let C be the this value.
Let promiseCapability be ? NewPromiseCapability (C ).
Let promiseResolve be Completion (GetPromiseResolve (C )).
IfAbruptRejectPromise (promiseResolve ,
promiseCapability ).
Let iteratorRecord be Completion (GetIterator (iterable ,
sync )).
IfAbruptRejectPromise (iteratorRecord ,
promiseCapability ).
Let result be Completion (PerformPromiseAny (iteratorRecord ,
C , promiseCapability , promiseResolve )).
If result is an abrupt
completion , then
If iteratorRecord .[[Done]] is
false , set result to Completion (IteratorClose (iteratorRecord ,
result )).
IfAbruptRejectPromise (result ,
promiseCapability ).
Return ! result .
Note
This function requires its this value to be a constructor function that supports the
parameter conventions of the Promise constructor .
27.2.4.3.1 PerformPromiseAny ( iteratorRecord ,
constructor , resultCapability , promiseResolve )
The abstract operation PerformPromiseAny takes arguments iteratorRecord (an
Iterator Record ),
constructor (a constructor ), resultCapability (a
PromiseCapability Record ),
and promiseResolve (a function object ) and returns either a
normal completion
containing an ECMAScript language
value or a throw
completion . It performs the following steps when called:
Let errors be a new empty List .
Let remainingElementsCount be the Record {
[[Value]] : 1 }.
Let index be 0.
Repeat,
Let next be ? IteratorStepValue (iteratorRecord ).
If next is done , then
Set remainingElementsCount .[[Value]] to
remainingElementsCount .[[Value]] - 1.
If remainingElementsCount .[[Value]] = 0, then
Let error be a newly created
AggregateError object.
Perform ! DefinePropertyOrThrow (error ,
"errors" , PropertyDescriptor { [[Configurable]] :
true , [[Enumerable]] :
false , [[Writable]] :
true , [[Value]] : CreateArrayFromList (errors ) }).
Return ThrowCompletion (error ).
Return resultCapability .[[Promise]] .
Append undefined to errors .
Let nextPromise be ? Call (promiseResolve ,
constructor , « next »).
Let stepsRejected be the algorithm steps defined in Promise.any
Reject Element Functions .
Let lengthRejected be the number of non-optional parameters
of the function definition in Promise.any
Reject Element Functions .
Let onRejected be CreateBuiltinFunction (stepsRejected ,
lengthRejected , "" , « [[AlreadyCalled]] , [[Index]] , [[Errors]] ,
[[Capability]] , [[RemainingElements]] »).
Set onRejected .[[AlreadyCalled]] to
false .
Set onRejected .[[Index]] to
index .
Set onRejected .[[Errors]] to
errors .
Set onRejected .[[Capability]] to
resultCapability .
Set onRejected .[[RemainingElements]]
to remainingElementsCount .
Set remainingElementsCount .[[Value]]
to remainingElementsCount .[[Value]]
+ 1.
Perform ? Invoke (nextPromise ,
"then" , « resultCapability .[[Resolve]] , onRejected »).
Set index to index + 1.
27.2.4.3.2 Promise.any Reject Element Functions
A Promise.any reject element function is an anonymous built-in function that
is used to reject a specific Promise.any element. Each
Promise.any reject element function has [[Index]] ,
[[Errors]] , [[Capability]] , [[RemainingElements]] , and [[AlreadyCalled]] internal slots.
When a Promise.any reject element function is called with argument
x , the following steps are taken:
Let F be the active function
object .
If F .[[AlreadyCalled]] is
true , return undefined .
Set F .[[AlreadyCalled]] to
true .
Let index be F .[[Index]] .
Let errors be F .[[Errors]] .
Let promiseCapability be F .[[Capability]] .
Let remainingElementsCount be F .[[RemainingElements]] .
Set errors [index ] to x .
Set remainingElementsCount .[[Value]] to
remainingElementsCount .[[Value]] - 1.
If remainingElementsCount .[[Value]] = 0,
then
Let error be a newly created
AggregateError object.
Perform ! DefinePropertyOrThrow (error ,
"errors" , PropertyDescriptor { [[Configurable]] : true , [[Enumerable]] : false , [[Writable]] : true , [[Value]] : CreateArrayFromList (errors ) }).
Return ? Call (promiseCapability .[[Reject]] , undefined , «
error »).
Return undefined .
The "length" property of a Promise.any reject element
function is 1 𝔽 .
27.2.4.4 Promise.prototype
The initial value of Promise.prototype is the Promise prototype
object .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }.
27.2.4.5 Promise.race ( iterable )
This function returns a new promise which is settled in the same way as the first passed
promise to settle. It resolves all elements of the passed iterable to promises as
it runs this algorithm.
Let C be the this value.
Let promiseCapability be ? NewPromiseCapability (C ).
Let promiseResolve be Completion (GetPromiseResolve (C )).
IfAbruptRejectPromise (promiseResolve ,
promiseCapability ).
Let iteratorRecord be Completion (GetIterator (iterable ,
sync )).
IfAbruptRejectPromise (iteratorRecord ,
promiseCapability ).
Let result be Completion (PerformPromiseRace (iteratorRecord ,
C , promiseCapability , promiseResolve )).
If result is an abrupt
completion , then
If iteratorRecord .[[Done]] is
false , set result to Completion (IteratorClose (iteratorRecord ,
result )).
IfAbruptRejectPromise (result ,
promiseCapability ).
Return ! result .
Note 1
If the iterable argument yields no values or if none of the promises
yielded by iterable ever settle, then the pending promise returned by
this method will never be settled.
Note 2
This function expects its this value to be a constructor function that supports the
parameter conventions of the Promise constructor . It also
expects that its this value provides a resolve
method.
27.2.4.5.1 PerformPromiseRace ( iteratorRecord ,
constructor , resultCapability , promiseResolve )
The abstract operation PerformPromiseRace takes arguments iteratorRecord (an
Iterator Record ),
constructor (a constructor ), resultCapability (a
PromiseCapability Record ),
and promiseResolve (a function object ) and returns either a
normal completion
containing an ECMAScript language
value or a throw
completion . It performs the following steps when called:
Repeat,
Let next be ? IteratorStepValue (iteratorRecord ).
If next is done , then
Return resultCapability .[[Promise]] .
Let nextPromise be ? Call (promiseResolve ,
constructor , « next »).
Perform ? Invoke (nextPromise ,
"then" , « resultCapability .[[Resolve]] , resultCapability .[[Reject]] »).
27.2.4.6 Promise.reject ( r )
This function returns a new promise rejected with the passed argument.
Let C be the this value.
Let promiseCapability be ? NewPromiseCapability (C ).
Perform ? Call (promiseCapability .[[Reject]] , undefined , «
r »).
Return promiseCapability .[[Promise]] .
Note
This function expects its this value to be a constructor function that supports the
parameter conventions of the Promise constructor .
27.2.4.7 Promise.resolve ( x )
This function returns either a new promise resolved with the passed argument, or the argument
itself if the argument is a promise produced by this constructor .
Let C be the this value.
If C is not an Object , throw a
TypeError exception.
Return ? PromiseResolve (C ,
x ).
Note
This function expects its this value to be a constructor function that supports the
parameter conventions of the Promise constructor .
27.2.4.7.1 PromiseResolve ( C , x )
The abstract operation PromiseResolve takes arguments C (an Object) and
x (an ECMAScript language value )
and returns either a normal
completion containing an ECMAScript language value
or a throw
completion . It returns a new promise resolved with x .
It performs the following steps when called:
If IsPromise (x ) is
true , then
Let xConstructor be ? Get (x ,
"constructor" ).
If SameValue (xConstructor ,
C ) is true , return x .
Let promiseCapability be ? NewPromiseCapability (C ).
Perform ? Call (promiseCapability .[[Resolve]] , undefined , «
x »).
Return promiseCapability .[[Promise]] .
27.2.4.8 Promise.try ( callback , ...args )
This function performs the following steps when called:
Let C be the this value.
If C is not an Object , throw a
TypeError exception.
Let promiseCapability be ? NewPromiseCapability (C ).
Let status be Completion (Call (callback ,
undefined , args )).
If status is an abrupt
completion , then
Perform ? Call (promiseCapability .[[Reject]] , undefined , «
status .[[Value]] »).
Else,
Perform ? Call (promiseCapability .[[Resolve]] , undefined , «
status .[[Value]] »).
Return promiseCapability .[[Promise]] .
Note
This function expects its this value to be a constructor function that supports the
parameter conventions of the Promise constructor .
27.2.4.9 Promise.withResolvers ( )
This function returns an object with three properties: a new promise together with the
resolve and reject functions associated with it.
Let C be the this value.
Let promiseCapability be ? NewPromiseCapability (C ).
Let obj be OrdinaryObjectCreate (%Object.prototype% ).
Perform ! CreateDataPropertyOrThrow (obj ,
"promise" , promiseCapability .[[Promise]] ).
Perform ! CreateDataPropertyOrThrow (obj ,
"resolve" , promiseCapability .[[Resolve]] ).
Perform ! CreateDataPropertyOrThrow (obj ,
"reject" , promiseCapability .[[Reject]] ).
Return obj .
27.2.4.10 get Promise [ %Symbol.species% ]
Promise[%Symbol.species%] is an accessor property whose set
accessor function is undefined . Its get accessor function performs the
following steps when called:
Return the this value.
The value of the "name" property of this function is "get
[Symbol.species]" .
Note
Promise prototype methods normally use their this value's
constructor to create a derived object.
However, a subclass constructor may over-ride that default
behaviour by redefining its %Symbol.species% property.
27.2.5 Properties of the Promise Prototype Object
The Promise prototype object :
is %Promise.prototype% .
has a [[Prototype]] internal slot whose value is %Object.prototype% .
is an ordinary
object .
does not have a [[PromiseState]] internal slot or any of the other
internal slots of Promise instances.
27.2.5.1 Promise.prototype.catch ( onRejected )
This method performs the following steps when called:
Let promise be the this value.
Return ? Invoke (promise ,
"then" , « undefined ,
onRejected »).
27.2.5.2 Promise.prototype.constructor
The initial value of Promise.prototype.constructor is %Promise% .
27.2.5.3 Promise.prototype.finally ( onFinally )
This method performs the following steps when called:
Let promise be the this value.
If promise is not an Object , throw a
TypeError exception.
Let C be ? SpeciesConstructor (promise ,
%Promise% ).
Assert :
IsConstructor (C ) is
true .
If IsCallable (onFinally ) is
false , then
Let thenFinally be onFinally .
Let catchFinally be onFinally .
Else,
Let thenFinallyClosure be a new Abstract Closure with
parameters (value ) that captures onFinally and
C and performs the following steps when called:
Let result be ? Call (onFinally ,
undefined ).
Let p be ? PromiseResolve (C ,
result ).
Let returnValue be a new Abstract Closure
with no parameters that captures value and performs the
following steps when called:
Return NormalCompletion (value ).
Let valueThunk be CreateBuiltinFunction (returnValue ,
0, "" , « »).
Return ? Invoke (p ,
"then" , « valueThunk »).
Let thenFinally be CreateBuiltinFunction (thenFinallyClosure ,
1, "" , « »).
Let catchFinallyClosure be a new Abstract Closure with
parameters (reason ) that captures onFinally and
C and performs the following steps when called:
Let result be ? Call (onFinally ,
undefined ).
Let p be ? PromiseResolve (C ,
result ).
Let throwReason be a new Abstract Closure
with no parameters that captures reason and performs the
following steps when called:
Return ThrowCompletion (reason ).
Let thrower be CreateBuiltinFunction (throwReason ,
0, "" , « »).
Return ? Invoke (p ,
"then" , « thrower »).
Let catchFinally be CreateBuiltinFunction (catchFinallyClosure ,
1, "" , « »).
Return ? Invoke (promise ,
"then" , « thenFinally ,
catchFinally »).
27.2.5.4 Promise.prototype.then ( onFulfilled ,
onRejected )
This method performs the following steps when called:
Let promise be the this value.
If IsPromise (promise ) is
false , throw a TypeError exception.
Let C be ? SpeciesConstructor (promise ,
%Promise% ).
Let resultCapability be ? NewPromiseCapability (C ).
Return PerformPromiseThen (promise ,
onFulfilled , onRejected , resultCapability ).
27.2.5.4.1 PerformPromiseThen ( promise ,
onFulfilled , onRejected [ , resultCapability ] )
The abstract operation PerformPromiseThen takes arguments promise (a Promise),
onFulfilled (an ECMAScript language
value ), and onRejected (an ECMAScript language value )
and optional argument resultCapability (a PromiseCapability Record )
and returns an ECMAScript language value .
It performs the “then” operation on promise using onFulfilled and
onRejected as its settlement actions. If resultCapability is
passed, the result is stored by updating resultCapability 's promise. If it is
not passed, then PerformPromiseThen is being called by a specification-internal
operation where the result does not matter. It performs the following steps when called:
Assert : IsPromise (promise ) is
true .
If resultCapability is not present, then
Set resultCapability to undefined .
If IsCallable (onFulfilled )
is false , then
Let onFulfilledJobCallback be empty .
Else,
Let onFulfilledJobCallback be HostMakeJobCallback (onFulfilled ).
If IsCallable (onRejected )
is false , then
Let onRejectedJobCallback be empty .
Else,
Let onRejectedJobCallback be HostMakeJobCallback (onRejected ).
Let fulfillReaction be the PromiseReaction
Record { [[Capability]] :
resultCapability , [[Type]] :
fulfill , [[Handler]] :
onFulfilledJobCallback }.
Let rejectReaction be the PromiseReaction
Record { [[Capability]] :
resultCapability , [[Type]] :
reject , [[Handler]] :
onRejectedJobCallback }.
If promise .[[PromiseState]] is
pending , then
Append fulfillReaction to promise .[[PromiseFulfillReactions]] .
Append rejectReaction to promise .[[PromiseRejectReactions]] .
Else if promise .[[PromiseState]] is
fulfilled , then
Let value be promise .[[PromiseResult]] .
Let fulfillJob be NewPromiseReactionJob (fulfillReaction ,
value ).
Perform HostEnqueuePromiseJob (fulfillJob .[[Job]] , fulfillJob .[[Realm]] ).
Else,
Assert : promise .[[PromiseState]] is
rejected .
Let reason be promise .[[PromiseResult]] .
If promise .[[PromiseIsHandled]] is
false , perform HostPromiseRejectionTracker (promise ,
"handle" ).
Let rejectJob be NewPromiseReactionJob (rejectReaction ,
reason ).
Perform HostEnqueuePromiseJob (rejectJob .[[Job]] , rejectJob .[[Realm]] ).
Set promise .[[PromiseIsHandled]] to
true .
If resultCapability is undefined , then
Return undefined .
Else,
Return resultCapability .[[Promise]] .
27.2.5.5 Promise.prototype [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is the
String value "Promise" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
27.2.6 Properties of Promise Instances
Promise instances are ordinary objects that inherit properties from the
Promise prototype
object (the intrinsic, %Promise.prototype% ).
Promise instances are initially created with the internal slots described in Table 92 .
Table 92: Internal Slots of Promise Instances
Internal Slot
Type
Description
[[PromiseState]]
pending , fulfilled , or
rejected
Governs how a promise will react to incoming calls to its then
method.
[[PromiseResult]]
an ECMAScript language
value or empty
The value with which the promise has been fulfilled or rejected, if any.
empty if and only if the [[PromiseState]] is pending .
[[PromiseFulfillReactions]]
a List
of PromiseReaction
Records
Records
to be processed when/if the promise transitions from the
pending state to the fulfilled
state.
[[PromiseRejectReactions]]
a List
of PromiseReaction
Records
Records
to be processed when/if the promise transitions from the
pending state to the rejected
state.
[[PromiseIsHandled]]
a Boolean
Indicates whether the promise has ever had a fulfillment or rejection
handler; used in unhandled rejection tracking.
27.3 GeneratorFunction Objects
GeneratorFunctions are functions that are usually created by evaluating GeneratorDeclaration s, GeneratorExpression s, and
GeneratorMethod s. They may also
be created by calling the %GeneratorFunction% intrinsic.
Figure 6 (Informative): Generator Objects Relationships
27.3.1 The GeneratorFunction Constructor
The GeneratorFunction constructor :
is %GeneratorFunction% .
is a subclass of Function.
creates and initializes a new GeneratorFunction when called as a function rather than as a
constructor . Thus the function call
GeneratorFunction (…) is equivalent to the object creation expression
new GeneratorFunction (…) with the same arguments.
may be used as the value of an extends clause of a class definition. Subclass
constructors that intend to inherit the specified
GeneratorFunction behaviour must include a super call to the GeneratorFunction
constructor to create and initialize subclass
instances with the internal slots necessary for built-in GeneratorFunction behaviour. All
ECMAScript syntactic forms for defining generator function objects create direct
instances of GeneratorFunction. There is no syntactic means to create instances of
GeneratorFunction subclasses.
27.3.1.1 GeneratorFunction ( ...parameterArgs ,
bodyArg )
The last argument (if any) specifies the body (executable code) of a generator function; any
preceding arguments specify formal parameters.
This function performs the following steps when called:
Let C be the active function object .
If bodyArg is not present, set bodyArg to the empty String.
Return ? CreateDynamicFunction (C ,
NewTarget, generator , parameterArgs ,
bodyArg ).
Note
27.3.2 Properties of the GeneratorFunction Constructor
The GeneratorFunction constructor :
is a standard built-in function object that inherits from the
Function constructor .
has a [[Prototype]] internal slot whose value is %Function% .
has a
"length" property whose value is 1 𝔽 .
has a "name" property whose value is
"GeneratorFunction" .
has the following properties:
27.3.2.1 GeneratorFunction.prototype
The initial value of GeneratorFunction.prototype is the GeneratorFunction
prototype object .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }.
27.3.3 Properties of the GeneratorFunction Prototype Object
The GeneratorFunction prototype object :
27.3.3.1 GeneratorFunction.prototype.constructor
The initial value of GeneratorFunction.prototype.constructor is %GeneratorFunction% .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
27.3.3.2 GeneratorFunction.prototype.prototype
The initial value of GeneratorFunction.prototype.prototype is %GeneratorPrototype% .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
27.3.3.3 GeneratorFunction.prototype [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is the
String value "GeneratorFunction" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
27.3.4 GeneratorFunction Instances
Every GeneratorFunction instance is an ECMAScript function object and has the
internal slots listed in Table
30 . The value of the [[IsClassConstructor]]
internal slot for all such instances is false .
Each GeneratorFunction instance has the following own properties:
27.3.4.1 length
The specification for the "length" property of Function instances given in
20.2.4.1 also applies to
GeneratorFunction instances.
27.3.4.2 name
The specification for the "name" property of Function instances given in
20.2.4.2 also applies to
GeneratorFunction instances.
27.3.4.3 prototype
Whenever a GeneratorFunction instance is created another ordinary object is also
created and is the initial value of the generator function's "prototype"
property. The value of the prototype property is used to initialize the [[Prototype]] internal slot of a newly created Generator when the
generator function object is invoked using [[Call]] .
This property has the attributes { [[Writable]] :
true , [[Enumerable]] : false ,
[[Configurable]] : false }.
Note
Unlike Function instances, the object that is the value of a GeneratorFunction's
"prototype" property does not have a
"constructor" property whose value is the GeneratorFunction
instance.
27.4 AsyncGeneratorFunction Objects
AsyncGeneratorFunctions are functions that are usually created by evaluating AsyncGeneratorDeclaration , AsyncGeneratorExpression ,
and AsyncGeneratorMethod
syntactic productions. They may also be created by calling the %AsyncGeneratorFunction%
intrinsic.
27.4.1 The AsyncGeneratorFunction Constructor
The AsyncGeneratorFunction constructor :
is %AsyncGeneratorFunction% .
is a subclass of Function.
creates and initializes a new AsyncGeneratorFunction when called as a function rather than
as a constructor . Thus the function call
AsyncGeneratorFunction (...) is equivalent to the object creation expression
new AsyncGeneratorFunction (...) with the same arguments.
may be used as the value of an extends clause of a class definition. Subclass
constructors that intend to inherit the specified
AsyncGeneratorFunction behaviour must include a super call to the
AsyncGeneratorFunction constructor to create and initialize subclass
instances with the internal slots necessary for built-in AsyncGeneratorFunction behaviour.
All ECMAScript syntactic forms for defining async generator function
objects create direct instances of AsyncGeneratorFunction. There is
no syntactic means to create instances of AsyncGeneratorFunction subclasses.
27.4.1.1 AsyncGeneratorFunction ( ...parameterArgs ,
bodyArg )
The last argument (if any) specifies the body (executable code) of an async generator
function; any preceding arguments specify formal parameters.
This function performs the following steps when called:
Let C be the active function object .
If bodyArg is not present, set bodyArg to the empty String.
Return ? CreateDynamicFunction (C ,
NewTarget, async-generator , parameterArgs ,
bodyArg ).
Note
27.4.2 Properties of the AsyncGeneratorFunction Constructor
The AsyncGeneratorFunction constructor :
is a standard built-in function object that inherits from the
Function constructor .
has a [[Prototype]] internal slot whose value is %Function% .
has a "length" property
whose value is 1 𝔽 .
has a "name" property whose value is
"AsyncGeneratorFunction" .
has the following properties:
27.4.2.1 AsyncGeneratorFunction.prototype
The initial value of AsyncGeneratorFunction.prototype is the AsyncGeneratorFunction
prototype object .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }.
27.4.3 Properties of the AsyncGeneratorFunction Prototype Object
The AsyncGeneratorFunction prototype object :
27.4.3.1 AsyncGeneratorFunction.prototype.constructor
The initial value of AsyncGeneratorFunction.prototype.constructor is %AsyncGeneratorFunction% .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
27.4.3.2 AsyncGeneratorFunction.prototype.prototype
The initial value of AsyncGeneratorFunction.prototype.prototype is %AsyncGeneratorPrototype% .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
27.4.3.3 AsyncGeneratorFunction.prototype [ %Symbol.toStringTag%
]
The initial value of the %Symbol.toStringTag% property is the
String value "AsyncGeneratorFunction" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
27.4.4 AsyncGeneratorFunction Instances
Every AsyncGeneratorFunction instance is an ECMAScript function object and has the
internal slots listed in Table
30 . The value of the [[IsClassConstructor]]
internal slot for all such instances is false .
Each AsyncGeneratorFunction instance has the following own properties:
27.4.4.1 length
The value of the "length" property is an integral Number that indicates
the typical number of arguments expected by the AsyncGeneratorFunction. However, the
language permits the function to be invoked with some other number of arguments. The
behaviour of an AsyncGeneratorFunction when invoked on a number of arguments other than the
number specified by its "length" property depends on the function.
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
27.4.4.2 name
The specification for the "name" property of Function instances given in
20.2.4.2 also applies to
AsyncGeneratorFunction instances.
27.4.4.3 prototype
Whenever an AsyncGeneratorFunction instance is created, another ordinary
object is also created and is the initial value of the async
generator function's "prototype" property. The value of the prototype
property is used to initialize the [[Prototype]] internal slot of a
newly created AsyncGenerator when the generator function object is invoked
using [[Call]] .
This property has the attributes { [[Writable]] :
true , [[Enumerable]] : false ,
[[Configurable]] : false }.
Note
Unlike function instances, the object that is the value of an
AsyncGeneratorFunction's "prototype" property does not have a
"constructor" property whose value is the AsyncGeneratorFunction
instance.
27.5 Generator Objects
A Generator is created by calling a generator function and conforms to both the iterator
interface and the iterable interface .
Generator instances directly inherit properties from the initial value of the
"prototype" property of the generator function that created the instance.
Generator instances indirectly inherit properties from %GeneratorPrototype% .
27.5.1 The %GeneratorPrototype% Object
The %GeneratorPrototype% object:
is %GeneratorFunction.prototype.prototype% .
is an ordinary
object .
is not a Generator instance and does not have a [[GeneratorState]]
internal slot.
has a [[Prototype]] internal slot whose value is %Iterator.prototype% .
has properties that are indirectly inherited by all Generator instances.
27.5.1.1 %GeneratorPrototype%.constructor
The initial value of %GeneratorPrototype% .constructor
is %GeneratorFunction.prototype% .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
27.5.1.2 %GeneratorPrototype%.next ( value )
Return ? GeneratorResume (this
value, value , empty ).
27.5.1.3 %GeneratorPrototype%.return ( value )
This method performs the following steps when called:
Let g be the this value.
Let C be ReturnCompletion (value ).
Return ? GeneratorResumeAbrupt (g ,
C , empty ).
27.5.1.4 %GeneratorPrototype%.throw ( exception )
This method performs the following steps when called:
Let g be the this value.
Let C be ThrowCompletion (exception ).
Return ? GeneratorResumeAbrupt (g ,
C , empty ).
27.5.1.5 %GeneratorPrototype% [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is the
String value "Generator" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
27.5.2 Properties of Generator Instances
Generator instances are initially created with the internal slots described in Table 93 .
Table 93: Internal Slots of Generator Instances
Internal Slot
Type
Description
[[GeneratorState]]
suspended-start ,
suspended-yield , executing , or
completed
The current execution state of the generator.
[[GeneratorContext]]
an execution context
The execution context that
is used when executing the code of this generator.
[[GeneratorBrand]]
a String or empty
A brand used to distinguish different kinds of generators. The [[GeneratorBrand]] of generators declared by
ECMAScript source text is
always empty .
27.5.3 Generator Abstract Operations
27.5.3.1 GeneratorStart ( generator ,
generatorBody )
The abstract operation GeneratorStart takes arguments generator (a Generator) and
generatorBody (a FunctionBody Parse
Node or an Abstract Closure with no parameters) and
returns unused . It performs the following steps when called:
Assert :
generator .[[GeneratorState]] is
suspended-start .
Let genContext be the running execution
context .
Set the Generator component of genContext to generator .
Let closure be a new Abstract Closure
with no parameters that captures generatorBody and performs the following
steps when called:
Let acGenContext be the running execution
context .
Let acGenerator be the Generator component of
acGenContext .
If generatorBody is a Parse
Node , then
Let result be Completion (Evaluation of
generatorBody ).
Else,
Assert :
generatorBody is an Abstract Closure
with no parameters.
Let result be Completion (generatorBody ()).
Assert : If we return here, the
generator either threw an exception or performed either an implicit or
explicit return.
Remove acGenContext from the execution context
stack and restore the execution context that
is at the top of the execution context
stack as the running execution
context .
Set acGenerator .[[GeneratorState]] to
completed .
NOTE: Once a generator enters the completed state it
never leaves it and its associated execution
context is never resumed. Any execution state
associated with acGenerator can be discarded at this point.
If result is a normal
completion , then
Let resultValue be undefined .
Else if result is a return
completion , then
Let resultValue be result .[[Value]] .
Else,
Assert : result is a
throw
completion .
Return ? result .
Return NormalCompletion (CreateIteratorResultObject (resultValue ,
true )).
Set the code evaluation state of genContext such that when evaluation is
resumed for that execution context ,
closure will be called with no arguments.
Set generator .[[GeneratorContext]] to
genContext .
Return unused .
27.5.3.2 GeneratorValidate ( generator ,
generatorBrand )
The abstract operation GeneratorValidate takes arguments generator (an ECMAScript language value ) and
generatorBrand (a String or empty ) and returns either a
normal completion
containing one of suspended-start ,
suspended-yield , or completed , or a throw completion . It
performs the following steps when called:
Perform ? RequireInternalSlot (generator ,
[[GeneratorState]] ).
Perform ? RequireInternalSlot (generator ,
[[GeneratorBrand]] ).
If generator .[[GeneratorBrand]] is not
generatorBrand , throw a TypeError exception.
Assert :
generator also has a [[GeneratorContext]]
internal slot.
Let state be generator .[[GeneratorState]] .
If state is executing , throw a
TypeError exception.
Return state .
27.5.3.3 GeneratorResume ( generator ,
value , generatorBrand )
The abstract operation GeneratorResume takes arguments generator (an ECMAScript language value ),
value (an ECMAScript language value or
empty ), and generatorBrand (a String or
empty ) and returns either a normal completion
containing an ECMAScript language
value or a throw
completion . It performs the following steps when called:
Let state be ? GeneratorValidate (generator ,
generatorBrand ).
If state is completed , return CreateIteratorResultObject (undefined ,
true ).
Assert :
state is either suspended-start or
suspended-yield .
Let genContext be generator .[[GeneratorContext]] .
Let methodContext be the running execution
context .
Suspend methodContext .
Set generator .[[GeneratorState]] to
executing .
Push genContext onto the execution context
stack ; genContext is now the running execution context .
Resume the suspended evaluation of
genContext using NormalCompletion (value )
as the result of the operation that suspended it. Let result be the value
returned by the resumed computation.
Assert :
When we return here, genContext has already been removed from the
execution context stack and
methodContext is the currently running execution context .
Return ? result .
27.5.3.4 GeneratorResumeAbrupt ( generator ,
abruptCompletion , generatorBrand )
The abstract operation GeneratorResumeAbrupt takes arguments generator (an
ECMAScript language value ),
abruptCompletion (a return
completion or a throw completion ),
and generatorBrand (a String or empty ) and returns either
a normal completion
containing an ECMAScript language
value or a throw
completion . It performs the following steps when called:
Let state be ? GeneratorValidate (generator ,
generatorBrand ).
If state is suspended-start , then
Set generator .[[GeneratorState]] to
completed .
NOTE: Once a generator enters the completed state it
never leaves it and its associated execution
context is never resumed. Any execution state
associated with generator can be discarded at this point.
Set state to completed .
If state is completed , then
If abruptCompletion is a return
completion , then
Return CreateIteratorResultObject (abruptCompletion .[[Value]] , true ).
Return ? abruptCompletion .
Assert :
state is suspended-yield .
Let genContext be generator .[[GeneratorContext]] .
Let methodContext be the running execution
context .
Suspend methodContext .
Set generator .[[GeneratorState]] to
executing .
Push genContext onto the execution context
stack ; genContext is now the running execution context .
Resume the suspended evaluation of
genContext using abruptCompletion as the result of
the operation that suspended it. Let result be the Completion
Record returned by the resumed computation.
Assert :
When we return here, genContext has already been removed from the
execution context stack and
methodContext is the currently running execution context .
Return ? result .
27.5.3.5 GetGeneratorKind ( )
The abstract operation GetGeneratorKind takes no arguments and returns
non-generator , sync , or
async . It performs the following steps when called:
Let genContext be the running execution
context .
If genContext does not have a Generator component, return
non-generator .
Let generator be the Generator component of genContext .
If generator has an [[AsyncGeneratorState]]
internal slot, return async .
Else, return sync .
27.5.3.6 GeneratorYield ( iteratorResult )
The abstract operation GeneratorYield takes argument iteratorResult (an Object
that conforms to the IteratorResult interface ) and
returns either a normal completion
containing an ECMAScript language
value or an abrupt completion .
It performs the following steps when called:
Let genContext be the running execution
context .
Assert :
genContext is the execution
context of a generator.
Let generator be the value of the Generator component of
genContext .
Assert :
GetGeneratorKind () is
sync .
Set generator .[[GeneratorState]] to
suspended-yield .
Remove genContext from the execution context
stack and restore the execution context that is at
the top of the execution context stack as
the running execution context .
Let callerContext be the running execution
context .
Resume callerContext passing NormalCompletion (iteratorResult ).
If genContext is ever resumed again, let resumptionValue be
the Completion
Record with which it is resumed.
Assert : If
control reaches here, then genContext is the running execution context
again.
Return resumptionValue .
27.5.3.7 Yield ( value )
The abstract operation Yield takes argument value (an ECMAScript language value ) and
returns either a normal completion
containing an ECMAScript language
value or an abrupt completion .
It performs the following steps when called:
Let generatorKind be GetGeneratorKind ().
If generatorKind is async , return ? AsyncGeneratorYield (? Await (value )).
Otherwise, return ? GeneratorYield (CreateIteratorResultObject (value ,
false )).
27.5.3.8 CreateIteratorFromClosure ( closure ,
generatorBrand , generatorPrototype [ , extraSlots ] )
The abstract operation CreateIteratorFromClosure takes arguments closure (an
Abstract Closure with no parameters),
generatorBrand (a String or empty ), and
generatorPrototype (an Object) and optional argument extraSlots (a
List of names of
internal slots) and returns a Generator. It performs the following steps when called:
NOTE: closure can contain uses of the Yield operation to yield an
IteratorResult object .
If extraSlots is not present, set extraSlots to a new empty
List .
Let internalSlotsList be the list-concatenation
of extraSlots and « [[GeneratorState]] , [[GeneratorContext]] , [[GeneratorBrand]] ».
Let generator be OrdinaryObjectCreate (generatorPrototype ,
internalSlotsList ).
Set generator .[[GeneratorBrand]] to
generatorBrand .
Set generator .[[GeneratorState]] to
suspended-start .
Let callerContext be the running execution
context .
Let calleeContext be a new execution
context .
Set the Function of calleeContext to null .
Set the Realm of calleeContext to the current Realm
Record .
Set the ScriptOrModule of calleeContext to callerContext 's
ScriptOrModule.
If callerContext is not already suspended, suspend
callerContext .
Push calleeContext onto the execution context
stack ; calleeContext is now the running execution context .
Perform GeneratorStart (generator ,
closure ).
Remove calleeContext from the execution context
stack and restore callerContext as the running execution context .
Return generator .
27.6 AsyncGenerator Objects
An AsyncGenerator is created by calling an async generator function and conforms to both the
async iterator interface and the
async iterable interface .
AsyncGenerator instances directly inherit properties from the initial value of the
"prototype" property of the async generator function that created the instance.
AsyncGenerator instances indirectly inherit properties from %AsyncGeneratorPrototype% .
27.6.1 The %AsyncGeneratorPrototype% Object
The %AsyncGeneratorPrototype% object:
is %AsyncGeneratorFunction.prototype.prototype% .
is an ordinary
object .
is not an AsyncGenerator instance and does not have an [[AsyncGeneratorState]] internal slot.
has a [[Prototype]] internal slot whose value is %AsyncIteratorPrototype% .
has properties that are indirectly inherited by all AsyncGenerator instances.
27.6.1.1 %AsyncGeneratorPrototype%.constructor
The initial value of %AsyncGeneratorPrototype% .constructor
is %AsyncGeneratorFunction.prototype% .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
27.6.1.2 %AsyncGeneratorPrototype%.next ( value )
Let generator be the this value.
Let promiseCapability be ! NewPromiseCapability (%Promise% ).
Let result be Completion (AsyncGeneratorValidate (generator ,
empty )).
IfAbruptRejectPromise (result ,
promiseCapability ).
Let state be generator .[[AsyncGeneratorState]] .
If state is completed , then
Let iteratorResult be CreateIteratorResultObject (undefined ,
true ).
Perform ! Call (promiseCapability .[[Resolve]] , undefined , «
iteratorResult »).
Return promiseCapability .[[Promise]] .
Let completion be NormalCompletion (value ).
Perform AsyncGeneratorEnqueue (generator ,
completion , promiseCapability ).
If state is either suspended-start or
suspended-yield , then
Perform AsyncGeneratorResume (generator ,
completion ).
Else,
Assert : state is either
executing or draining-queue .
Return promiseCapability .[[Promise]] .
27.6.1.3 %AsyncGeneratorPrototype%.return ( value )
Let generator be the this value.
Let promiseCapability be ! NewPromiseCapability (%Promise% ).
Let result be Completion (AsyncGeneratorValidate (generator ,
empty )).
IfAbruptRejectPromise (result ,
promiseCapability ).
Let completion be ReturnCompletion (value ).
Perform AsyncGeneratorEnqueue (generator ,
completion , promiseCapability ).
Let state be generator .[[AsyncGeneratorState]] .
If state is either suspended-start or
completed , then
Set generator .[[AsyncGeneratorState]] to
draining-queue .
Perform AsyncGeneratorAwaitReturn (generator ).
Else if state is suspended-yield , then
Perform AsyncGeneratorResume (generator ,
completion ).
Else,
Assert : state is either
executing or draining-queue .
Return promiseCapability .[[Promise]] .
27.6.1.4 %AsyncGeneratorPrototype%.throw ( exception
)
Let generator be the this value.
Let promiseCapability be ! NewPromiseCapability (%Promise% ).
Let result be Completion (AsyncGeneratorValidate (generator ,
empty )).
IfAbruptRejectPromise (result ,
promiseCapability ).
Let state be generator .[[AsyncGeneratorState]] .
If state is suspended-start , then
Set generator .[[AsyncGeneratorState]] to
completed .
Set state to completed .
If state is completed , then
Perform ! Call (promiseCapability .[[Reject]] , undefined , «
exception »).
Return promiseCapability .[[Promise]] .
Let completion be ThrowCompletion (exception ).
Perform AsyncGeneratorEnqueue (generator ,
completion , promiseCapability ).
If state is suspended-yield , then
Perform AsyncGeneratorResume (generator ,
completion ).
Else,
Assert : state is either
executing or draining-queue .
Return promiseCapability .[[Promise]] .
27.6.1.5 %AsyncGeneratorPrototype% [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is the
String value "AsyncGenerator" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
27.6.2 Properties of AsyncGenerator Instances
AsyncGenerator instances are initially created with the internal slots described below:
Table 94: Internal Slots of AsyncGenerator Instances
Internal Slot
Type
Description
[[AsyncGeneratorState]]
suspended-start ,
suspended-yield , executing ,
draining-queue , or completed
The current execution state of the async generator.
[[AsyncGeneratorContext]]
an execution context
The execution context that
is used when executing the code of this async generator.
[[AsyncGeneratorQueue]]
a List
of AsyncGeneratorRequest
Records
Records
which represent requests to resume the async generator. Except during state
transitions, it is non-empty if and only if [[AsyncGeneratorState]] is either
executing or draining-queue .
[[GeneratorBrand]]
a String or empty
A brand used to distinguish different kinds of async generators. The [[GeneratorBrand]] of async generators declared by
ECMAScript source text is
always empty .
27.6.3 AsyncGenerator Abstract Operations
27.6.3.1 AsyncGeneratorRequest Records
An AsyncGeneratorRequest is a
Record value used to
store information about how an async generator should be resumed and contains capabilities
for fulfilling or rejecting the corresponding promise.
They have the following fields:
Table 95: AsyncGeneratorRequest Record Fields
27.6.3.2 AsyncGeneratorStart ( generator ,
generatorBody )
The abstract operation AsyncGeneratorStart takes arguments generator (an
AsyncGenerator) and generatorBody (a FunctionBody Parse
Node or an Abstract Closure with no parameters) and
returns unused . It performs the following steps when called:
Assert :
generator .[[AsyncGeneratorState]] is
suspended-start .
Let genContext be the running execution
context .
Set the Generator component of genContext to generator .
Let closure be a new Abstract Closure
with no parameters that captures generatorBody and performs the following
steps when called:
Let acGenContext be the running execution
context .
Let acGenerator be the Generator component of
acGenContext .
If generatorBody is a Parse
Node , then
Let result be Completion (Evaluation of
generatorBody ).
Else,
Assert :
generatorBody is an Abstract Closure
with no parameters.
Let result be Completion (generatorBody ()).
Assert : If we return here, the async
generator either threw an exception or performed either an implicit or
explicit return.
Remove acGenContext from the execution context
stack and restore the execution context that
is at the top of the execution context
stack as the running execution
context .
Set acGenerator .[[AsyncGeneratorState]]
to draining-queue .
If result is a normal
completion , set result to NormalCompletion (undefined ).
If result is a return
completion , set result to NormalCompletion (result .[[Value]] ).
Perform AsyncGeneratorCompleteStep (acGenerator ,
result , true ).
Perform AsyncGeneratorDrainQueue (acGenerator ).
Return NormalCompletion (undefined ).
Set the code evaluation state of genContext such that when evaluation is
resumed for that execution context ,
closure will be called with no arguments.
Set generator .[[AsyncGeneratorContext]] to
genContext .
Set generator .[[AsyncGeneratorQueue]] to a new
empty List .
Return unused .
27.6.3.3 AsyncGeneratorValidate ( generator ,
generatorBrand )
The abstract operation AsyncGeneratorValidate takes arguments generator (an
ECMAScript language value ) and
generatorBrand (a String or empty ) and returns either a
normal completion
containing unused or a throw completion . It
performs the following steps when called:
Perform ? RequireInternalSlot (generator ,
[[AsyncGeneratorContext]] ).
Perform ? RequireInternalSlot (generator ,
[[AsyncGeneratorState]] ).
Perform ? RequireInternalSlot (generator ,
[[AsyncGeneratorQueue]] ).
If generator .[[GeneratorBrand]] is not
generatorBrand , throw a TypeError exception.
Return unused .
27.6.3.4 AsyncGeneratorEnqueue ( generator ,
completion , promiseCapability )
The abstract operation AsyncGeneratorEnqueue takes arguments generator (an
AsyncGenerator), completion (a Completion Record ),
and promiseCapability (a PromiseCapability
Record ) and returns unused . It performs the
following steps when called:
Let request be AsyncGeneratorRequest
{ [[Completion]] : completion , [[Capability]] : promiseCapability }.
Append request to generator .[[AsyncGeneratorQueue]] .
Return unused .
27.6.3.5 AsyncGeneratorCompleteStep ( generator ,
completion , done [ , realm ] )
The abstract operation AsyncGeneratorCompleteStep takes arguments generator (an
AsyncGenerator), completion (a Completion Record ),
and done (a Boolean) and optional argument realm (a Realm
Record ) and returns unused . It performs the
following steps when called:
Assert :
generator .[[AsyncGeneratorQueue]] is not empty.
Let next be the first element of generator .[[AsyncGeneratorQueue]] .
Remove the first element from generator .[[AsyncGeneratorQueue]] .
Let promiseCapability be next .[[Capability]] .
Let value be completion .[[Value]] .
If completion is a throw
completion , then
Perform ! Call (promiseCapability .[[Reject]] , undefined , «
value »).
Else,
Assert : completion is a
normal
completion .
If realm is present, then
Let oldRealm be the running execution
context 's Realm .
Set the running
execution context 's Realm to
realm .
Let iteratorResult be CreateIteratorResultObject (value ,
done ).
Set the running
execution context 's Realm to
oldRealm .
Else,
Let iteratorResult be CreateIteratorResultObject (value ,
done ).
Perform ! Call (promiseCapability .[[Resolve]] , undefined , «
iteratorResult »).
Return unused .
27.6.3.6 AsyncGeneratorResume ( generator ,
completion )
The abstract operation AsyncGeneratorResume takes arguments generator (an
AsyncGenerator) and completion (a Completion Record )
and returns unused . It performs the following steps when called:
Assert :
generator .[[AsyncGeneratorState]] is either
suspended-start or suspended-yield .
Let genContext be generator .[[AsyncGeneratorContext]] .
Let callerContext be the running execution
context .
Suspend callerContext .
Set generator .[[AsyncGeneratorState]] to
executing .
Push genContext onto the execution context
stack ; genContext is now the running execution context .
Resume the suspended evaluation of
genContext using completion as the result of the
operation that suspended it. Let result be the Completion
Record returned by the resumed computation.
Assert :
result is never an abrupt
completion .
Assert :
When we return here, genContext has already been removed from the
execution context stack and
callerContext is the currently running execution context .
Return unused .
27.6.3.7 AsyncGeneratorUnwrapYieldResumption (
resumptionValue )
The abstract operation AsyncGeneratorUnwrapYieldResumption takes argument
resumptionValue (a Completion
Record ) and returns either a normal completion
containing an ECMAScript language
value or an abrupt completion .
It performs the following steps when called:
If resumptionValue is not a return
completion , return ? resumptionValue .
Let awaited be Completion (Await (resumptionValue .[[Value]] )).
If awaited is a throw
completion , return ? awaited .
Assert :
awaited is a normal
completion .
Return ReturnCompletion (awaited .[[Value]] ).
27.6.3.8 AsyncGeneratorYield ( value )
The abstract operation AsyncGeneratorYield takes argument value (an ECMAScript language value ) and
returns either a normal completion
containing an ECMAScript language
value or an abrupt completion .
It performs the following steps when called:
Let genContext be the running execution
context .
Assert :
genContext is the execution
context of a generator.
Let generator be the value of the Generator component of
genContext .
Assert :
GetGeneratorKind () is
async .
Let completion be NormalCompletion (value ).
Assert :
The execution context stack has
at least two elements.
Let previousContext be the second to top element of the execution context stack .
Let previousRealm be previousContext 's Realm .
Perform AsyncGeneratorCompleteStep (generator ,
completion , false , previousRealm ).
Let queue be generator .[[AsyncGeneratorQueue]] .
If queue is not empty, then
NOTE: Execution continues without suspending the generator.
Let toYield be the first element of queue .
Let resumptionValue be Completion (toYield .[[Completion]] ).
Return ? AsyncGeneratorUnwrapYieldResumption (resumptionValue ).
Else,
Set generator .[[AsyncGeneratorState]] to
suspended-yield .
Remove genContext from the execution context
stack and restore the execution context that
is at the top of the execution context
stack as the running execution
context .
Let callerContext be the running execution
context .
Resume callerContext passing undefined . If
genContext is ever resumed again, let resumptionValue
be the Completion
Record with which it is resumed.
Assert : If control reaches here, then
genContext is the running execution
context again.
Return ? AsyncGeneratorUnwrapYieldResumption (resumptionValue ).
27.6.3.9 AsyncGeneratorAwaitReturn ( generator )
The abstract operation AsyncGeneratorAwaitReturn takes argument generator (an
AsyncGenerator) and returns unused . It performs the following steps
when called:
Assert :
generator .[[AsyncGeneratorState]] is
draining-queue .
Let queue be generator .[[AsyncGeneratorQueue]] .
Assert :
queue is not empty.
Let next be the first element of queue .
Let completion be Completion (next .[[Completion]] ).
Assert :
completion is a return
completion .
Let promiseCompletion be Completion (PromiseResolve (%Promise% ,
completion .[[Value]] )).
If promiseCompletion is an abrupt
completion , then
Perform AsyncGeneratorCompleteStep (generator ,
promiseCompletion , true ).
Perform AsyncGeneratorDrainQueue (generator ).
Return unused .
Assert :
promiseCompletion is a normal
completion .
Let promise be promiseCompletion .[[Value]] .
Let fulfilledClosure be a new Abstract Closure
with parameters (value ) that captures generator and performs
the following steps when called:
Assert : generator .[[AsyncGeneratorState]] is
draining-queue .
Let result be NormalCompletion (value ).
Perform AsyncGeneratorCompleteStep (generator ,
result , true ).
Perform AsyncGeneratorDrainQueue (generator ).
Return NormalCompletion (undefined ).
Let onFulfilled be CreateBuiltinFunction (fulfilledClosure ,
1, "" , « »).
Let rejectedClosure be a new Abstract Closure
with parameters (reason ) that captures generator and performs
the following steps when called:
Assert : generator .[[AsyncGeneratorState]] is
draining-queue .
Let result be ThrowCompletion (reason ).
Perform AsyncGeneratorCompleteStep (generator ,
result , true ).
Perform AsyncGeneratorDrainQueue (generator ).
Return NormalCompletion (undefined ).
Let onRejected be CreateBuiltinFunction (rejectedClosure ,
1, "" , « »).
Perform PerformPromiseThen (promise ,
onFulfilled , onRejected ).
Return unused .
27.6.3.10 AsyncGeneratorDrainQueue ( generator )
The abstract operation AsyncGeneratorDrainQueue takes argument generator (an
AsyncGenerator) and returns unused . It drains the generator's
AsyncGeneratorQueue until it encounters an AsyncGeneratorRequest which
holds a return completion .
It performs the following steps when called:
Assert :
generator .[[AsyncGeneratorState]] is
draining-queue .
Let queue be generator .[[AsyncGeneratorQueue]] .
Repeat, while queue is not empty,
Let next be the first element of queue .
Let completion be Completion (next .[[Completion]] ).
If completion is a return
completion , then
Perform AsyncGeneratorAwaitReturn (generator ).
Return unused .
Else,
If completion is a normal
completion , then
Set completion to NormalCompletion (undefined ).
Perform AsyncGeneratorCompleteStep (generator ,
completion , true ).
Set generator .[[AsyncGeneratorState]] to
completed .
Return unused .
27.6.3.11 CreateAsyncIteratorFromClosure ( closure ,
generatorBrand , generatorPrototype )
The abstract operation CreateAsyncIteratorFromClosure takes arguments closure (an
Abstract Closure with no parameters),
generatorBrand (a String or empty ), and
generatorPrototype (an Object) and returns an AsyncGenerator. It performs the
following steps when called:
NOTE: closure can contain uses of the Await operation and uses of the
Yield
operation to yield an IteratorResult
object .
Let internalSlotsList be « [[AsyncGeneratorState]] , [[AsyncGeneratorContext]] , [[AsyncGeneratorQueue]] , [[GeneratorBrand]] ».
Let generator be OrdinaryObjectCreate (generatorPrototype ,
internalSlotsList ).
Set generator .[[GeneratorBrand]] to
generatorBrand .
Set generator .[[AsyncGeneratorState]] to
suspended-start .
Let callerContext be the running execution
context .
Let calleeContext be a new execution
context .
Set the Function of calleeContext to null .
Set the Realm of calleeContext to the current Realm
Record .
Set the ScriptOrModule of calleeContext to callerContext 's
ScriptOrModule.
If callerContext is not already suspended, suspend
callerContext .
Push calleeContext onto the execution context
stack ; calleeContext is now the running execution context .
Perform AsyncGeneratorStart (generator ,
closure ).
Remove calleeContext from the execution context
stack and restore callerContext as the running execution context .
Return generator .
27.7 AsyncFunction Objects
AsyncFunctions are functions that are usually created by evaluating AsyncFunctionDeclaration s, AsyncFunctionExpression s,
AsyncMethod s, and AsyncArrowFunction s. They may
also be created by calling the %AsyncFunction% intrinsic.
27.7.1 The AsyncFunction Constructor
The AsyncFunction constructor :
is %AsyncFunction% .
is a subclass of Function.
creates and initializes a new AsyncFunction when called as a function rather than as a
constructor . Thus the function call
AsyncFunction(…) is equivalent to the object creation expression
new AsyncFunction(…) with the same arguments.
may be used as the value of an extends clause of a class definition. Subclass
constructors that intend to inherit the specified
AsyncFunction behaviour must include a super call to the AsyncFunction
constructor to create and initialize a subclass
instance with the internal slots necessary for built-in async function behaviour. All
ECMAScript syntactic forms for defining async function objects create direct
instances of AsyncFunction. There is no syntactic means to create instances of AsyncFunction
subclasses.
27.7.1.1 AsyncFunction ( ...parameterArgs ,
bodyArg )
The last argument (if any) specifies the body (executable code) of an async function. Any
preceding arguments specify formal parameters.
This function performs the following steps when called:
Let C be the active function object .
If bodyArg is not present, set bodyArg to the empty String.
Return ? CreateDynamicFunction (C ,
NewTarget, async , parameterArgs ,
bodyArg ).
Note
27.7.2 Properties of the AsyncFunction Constructor
The AsyncFunction constructor :
is a standard built-in function object that inherits from the
Function constructor .
has a [[Prototype]] internal slot whose value is %Function% .
has a "length"
property whose value is 1 𝔽 .
has a "name" property whose value is "AsyncFunction" .
has the following properties:
27.7.2.1 AsyncFunction.prototype
The initial value of AsyncFunction.prototype is the AsyncFunction prototype
object .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }.
27.7.3 Properties of the AsyncFunction Prototype Object
The AsyncFunction prototype object :
27.7.3.1 AsyncFunction.prototype.constructor
The initial value of AsyncFunction.prototype.constructor is %AsyncFunction% .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
27.7.3.2 AsyncFunction.prototype [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is the
String value "AsyncFunction" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
27.7.4 AsyncFunction Instances
Every AsyncFunction instance is an ECMAScript function object and has the
internal slots listed in Table
30 . The value of the [[IsClassConstructor]]
internal slot for all such instances is false . AsyncFunction instances are
not constructors and do not have a [[Construct]] internal method. AsyncFunction instances do not have a
prototype property as they are not constructable.
Each AsyncFunction instance has the following own properties:
27.7.4.1 length
The specification for the "length" property of Function instances given in
20.2.4.1 also applies to
AsyncFunction instances.
27.7.4.2 name
The specification for the "name" property of Function instances given in
20.2.4.2 also applies to
AsyncFunction instances.
27.7.5 Async Functions Abstract Operations
27.7.5.1 AsyncFunctionStart ( promiseCapability ,
asyncFunctionBody )
The abstract operation AsyncFunctionStart takes arguments promiseCapability (a
PromiseCapability Record ) and
asyncFunctionBody (a FunctionBody Parse
Node , an ExpressionBody Parse
Node , or an Abstract Closure with no parameters) and
returns unused . It performs the following steps when called:
Let runningContext be the running execution
context .
Let asyncContext be a copy of runningContext .
NOTE: Copying the execution state is required for AsyncBlockStart to
resume its execution. It is ill-defined to resume a currently executing context.
Perform AsyncBlockStart (promiseCapability ,
asyncFunctionBody , asyncContext ).
Return unused .
27.7.5.2 AsyncBlockStart ( promiseCapability ,
asyncBody , asyncContext )
The abstract operation AsyncBlockStart takes arguments promiseCapability (a
PromiseCapability Record ),
asyncBody (a Parse Node or an Abstract
Closure with no parameters), and asyncContext (an
execution context ) and returns
unused . It performs the following steps when called:
Let runningContext be the running execution
context .
Let closure be a new Abstract Closure
with no parameters that captures promiseCapability and
asyncBody and performs the following steps when called:
Let acAsyncContext be the running execution
context .
If asyncBody is a Parse
Node , then
Let result be Completion (Evaluation of
asyncBody ).
Else,
Assert : asyncBody
is an Abstract Closure
with no parameters.
Let result be Completion (asyncBody ()).
Assert : If we return here, the async
function either threw an exception or performed an implicit or explicit
return; all awaiting is done.
Remove acAsyncContext from the execution context
stack and restore the execution context that
is at the top of the execution context
stack as the running execution
context .
If result is a normal
completion , then
Perform ! Call (promiseCapability .[[Resolve]] , undefined , «
undefined »).
Else if result is a return
completion , then
Perform ! Call (promiseCapability .[[Resolve]] , undefined , «
result .[[Value]] »).
Else,
Assert : result is a
throw
completion .
Perform ! Call (promiseCapability .[[Reject]] , undefined , «
result .[[Value]] »).
Return NormalCompletion (unused ).
Set the code evaluation state of asyncContext such that when evaluation
is resumed for that execution context ,
closure will be called with no arguments.
Push asyncContext onto the execution context
stack ; asyncContext is now the running execution context .
Resume the suspended evaluation of
asyncContext . Let result be the value returned by
the resumed computation.
Assert :
When we return here, asyncContext has already been removed from the
execution context stack and
runningContext is the currently running execution context .
Assert :
result is a normal
completion with a value of unused . The
possible sources of this value are Await or, if the async function doesn't await
anything, step 2.i above.
Return unused .
27.7.5.3 Await ( value )
The abstract operation Await takes argument value (an ECMAScript language value ) and
returns either a normal completion
containing either an ECMAScript language
value or empty , or a throw completion . It
performs the following steps when called:
Let asyncContext be the running execution
context .
Let promise be ? PromiseResolve (%Promise% , value ).
Let fulfilledClosure be a new Abstract Closure
with parameters (v ) that captures asyncContext and performs
the following steps when called:
Let prevContext be the running execution
context .
Suspend prevContext .
Push asyncContext onto the execution context
stack ; asyncContext is now the running execution
context .
Resume the suspended evaluation of
asyncContext using NormalCompletion (v )
as the result of the operation that suspended it.
Assert : When we reach this step,
asyncContext has already been removed from the execution context
stack and prevContext is the currently
running execution
context .
Return NormalCompletion (undefined ).
Let onFulfilled be CreateBuiltinFunction (fulfilledClosure ,
1, "" , « »).
Let rejectedClosure be a new Abstract Closure
with parameters (reason ) that captures asyncContext and
performs the following steps when called:
Let prevContext be the running execution
context .
Suspend prevContext .
Push asyncContext onto the execution context
stack ; asyncContext is now the running execution
context .
Resume the suspended evaluation of
asyncContext using ThrowCompletion (reason )
as the result of the operation that suspended it.
Assert : When we reach this step,
asyncContext has already been removed from the execution context
stack and prevContext is the currently
running execution
context .
Return NormalCompletion (undefined ).
Let onRejected be CreateBuiltinFunction (rejectedClosure ,
1, "" , « »).
Perform PerformPromiseThen (promise ,
onFulfilled , onRejected ).
Remove asyncContext from the execution context
stack and restore the execution context that is at
the top of the execution context stack as
the running execution context .
Let callerContext be the running execution
context .
Resume callerContext passing empty . If
asyncContext is ever resumed again, let completion be the
Completion
Record with which it is resumed.
Assert : If
control reaches here, then asyncContext is the running execution context
again.
Return completion .
28 Reflection
28.1 The Reflect Object
The Reflect object:
is %Reflect% .
is the initial value of the "Reflect" property of the global
object .
is an ordinary
object .
has a [[Prototype]] internal slot whose value is %Object.prototype% .
is not a function
object .
does not have a [[Construct]] internal method; it cannot be used as a
constructor
with the new operator.
does not have a [[Call]] internal method; it cannot be invoked as a
function.
28.1.1 Reflect.apply ( target , thisArgument ,
argumentsList )
This function performs the following steps when called:
If IsCallable (target ) is
false , throw a TypeError exception.
Let args be ? CreateListFromArrayLike (argumentsList ).
Perform PrepareForTailCall ().
Return ? Call (target ,
thisArgument , args ).
28.1.2 Reflect.construct ( target ,
argumentsList [ , newTarget ] )
This function performs the following steps when called:
If IsConstructor (target ) is
false , throw a TypeError exception.
If newTarget is not present, set newTarget to target .
Else if IsConstructor (newTarget ) is
false , throw a TypeError exception.
Let args be ? CreateListFromArrayLike (argumentsList ).
Return ? Construct (target , args ,
newTarget ).
28.1.3 Reflect.defineProperty ( target ,
propertyKey , attributes )
This function performs the following steps when called:
If target is not an Object , throw a
TypeError exception.
Let key be ? ToPropertyKey (propertyKey ).
Let desc be ? ToPropertyDescriptor (attributes ).
Return ? target .[[DefineOwnProperty]] (key ,
desc ).
28.1.4 Reflect.deleteProperty ( target ,
propertyKey )
This function performs the following steps when called:
If target is not an Object , throw a
TypeError exception.
Let key be ? ToPropertyKey (propertyKey ).
Return ? target .[[Delete]] (key ).
28.1.5 Reflect.get ( target , propertyKey [ ,
receiver ] )
This function performs the following steps when called:
If target is not an Object , throw a
TypeError exception.
Let key be ? ToPropertyKey (propertyKey ).
If receiver is not present, then
Set receiver to target .
Return ? target .[[Get]] (key , receiver ).
28.1.6 Reflect.getOwnPropertyDescriptor ( target ,
propertyKey )
This function performs the following steps when called:
If target is not an Object , throw a
TypeError exception.
Let key be ? ToPropertyKey (propertyKey ).
Let desc be ? target .[[GetOwnProperty]] (key ).
Return FromPropertyDescriptor (desc ).
28.1.7 Reflect.getPrototypeOf ( target )
This function performs the following steps when called:
If target is not an Object , throw a
TypeError exception.
Return ? target .[[GetPrototypeOf]] () .
28.1.8 Reflect.has ( target , propertyKey )
This function performs the following steps when called:
If target is not an Object , throw a
TypeError exception.
Let key be ? ToPropertyKey (propertyKey ).
Return ? target .[[HasProperty]] (key ).
28.1.9 Reflect.isExtensible ( target )
This function performs the following steps when called:
If target is not an Object , throw a
TypeError exception.
Return ? target .[[IsExtensible]] () .
28.1.10 Reflect.ownKeys ( target )
This function performs the following steps when called:
If target is not an Object , throw a
TypeError exception.
Let keys be ? target .[[OwnPropertyKeys]] () .
Return CreateArrayFromList (keys ).
28.1.11 Reflect.preventExtensions ( target )
This function performs the following steps when called:
If target is not an Object , throw a
TypeError exception.
Return ? target .[[PreventExtensions]] () .
28.1.12 Reflect.set ( target , propertyKey ,
V [ , receiver ] )
This function performs the following steps when called:
If target is not an Object , throw a
TypeError exception.
Let key be ? ToPropertyKey (propertyKey ).
If receiver is not present, then
Set receiver to target .
Return ? target .[[Set]] (key , V ,
receiver ).
28.1.13 Reflect.setPrototypeOf ( target , proto
)
This function performs the following steps when called:
If target is not an Object , throw a
TypeError exception.
If proto is not an Object and proto is
not null , throw a TypeError exception.
Return ? target .[[SetPrototypeOf]] (proto ).
28.1.14 Reflect [ %Symbol.toStringTag% ]
The initial value of the %Symbol.toStringTag% property is the
String value "Reflect" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }.
28.2 Proxy Objects
28.2.1 The Proxy Constructor
The Proxy constructor :
is %Proxy% .
is the initial value of the "Proxy" property of the global
object .
creates and initializes a new Proxy object when called as a constructor .
is not intended to be called as a function and will throw an exception when called in that
manner.
28.2.1.1 Proxy ( target , handler )
This function performs the following steps when called:
If NewTarget is undefined , throw a TypeError
exception.
Return ? ProxyCreate (target ,
handler ).
28.2.2 Properties of the Proxy Constructor
The Proxy constructor :
has a [[Prototype]] internal slot whose value is %Function.prototype% .
does not have a "prototype" property because Proxy objects do not have a
[[Prototype]] internal slot that requires initialization.
has the following properties:
28.2.2.1 Proxy.revocable ( target , handler
)
This function creates a revocable Proxy object.
It performs the following steps when called:
Let proxy be ? ProxyCreate (target ,
handler ).
Let revokerClosure be a new Abstract Closure
with no parameters that captures nothing and performs the following steps when
called:
Let F be the active function
object .
Let p be F .[[RevocableProxy]] .
If p is null , return NormalCompletion (undefined ).
Set F .[[RevocableProxy]] to
null .
Assert : p is a Proxy exotic object .
Set p .[[ProxyTarget]] to
null .
Set p .[[ProxyHandler]] to
null .
Return NormalCompletion (undefined ).
Let revoker be CreateBuiltinFunction (revokerClosure ,
0, "" , « [[RevocableProxy]] »).
Set revoker .[[RevocableProxy]] to
proxy .
Let result be OrdinaryObjectCreate (%Object.prototype% ).
Perform ! CreateDataPropertyOrThrow (result ,
"proxy" , proxy ).
Perform ! CreateDataPropertyOrThrow (result ,
"revoke" , revoker ).
Return result .
28.3 Module Namespace Objects
A Module Namespace Object is a module namespace exotic object that
provides runtime property-based access to a module's exported bindings. There is no constructor function
for Module Namespace Objects. Instead, such an object is created for each module that is imported by
an ImportDeclaration that
contains a NameSpaceImport .
In addition to the properties specified in 10.4.6 each Module
Namespace Object has the following own property:
28.3.1 %Symbol.toStringTag%
The initial value of the %Symbol.toStringTag% property is the
String value "Module" .
This property has the attributes { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }.
29 Memory Model
The memory consistency model, or memory model , specifies the possible orderings
of Shared Data Block events , arising via
accessing TypedArray
instances backed by a SharedArrayBuffer and via methods on the Atomics object. When the program has no
data races (defined below), the ordering of events appears as sequentially consistent, i.e., as an
interleaving of actions from each agent . When the program has data races, shared memory operations
may appear sequentially inconsistent. For example, programs may exhibit causality-violating behaviour
and other astonishments. These astonishments arise from compiler transforms and the design of CPUs
(e.g., out-of-order execution and speculation). The memory model defines both the precise conditions
under which a program exhibits sequentially consistent behaviour as well as the possible values read
from data races. To wit, there is no undefined behaviour.
The memory model is defined as relational constraints on events introduced by abstract operations on
SharedArrayBuffer or by methods on the Atomics object during an evaluation.
Note
This section provides an axiomatic model on events introduced by the abstract operations
on SharedArrayBuffers. It bears stressing that the model is not expressible algorithmically,
unlike the rest of this specification. The nondeterministic introduction of events by abstract operations
is the interface between the operational semantics of ECMAScript evaluation and the axiomatic
semantics of the memory model. The semantics of these events is defined by considering graphs of
all events in an evaluation. These are neither Static Semantics nor Runtime Semantics. There is
no demonstrated algorithmic implementation, but instead a set of constraints that determine if a
particular event graph is allowed or disallowed.
29.1 Memory Model Fundamentals
Shared memory accesses (reads and writes) are divided into two groups, atomic accesses and data
accesses, defined below. Atomic accesses are sequentially consistent, i.e., there is a strict total
ordering of events agreed upon by all agents in an agent cluster . Non-atomic accesses
do not have a strict total ordering agreed upon by all agents , i.e., unordered.
Note 1
No orderings weaker than sequentially consistent and stronger than unordered, such as
release-acquire, are supported.
A Shared Data Block event is either a
ReadSharedMemory , WriteSharedMemory , or ReadModifyWriteSharedMemory Record .
Table 96: ReadSharedMemory Event Fields
Field Name
Value
Meaning
[[Order]]
seq-cst or unordered
The weakest ordering guaranteed by the memory model for
the event.
[[NoTear]]
a Boolean
Whether this event is allowed to read from multiple write events with equal
range as this event.
[[Block]]
a Shared Data Block
The block the event operates on.
[[ByteIndex]]
a non-negative integer
The byte address of the read in [[Block]] .
[[ElementSize]]
a non-negative integer
The size of the read.
Table 97: WriteSharedMemory Event Fields
Field Name
Value
Meaning
[[Order]]
seq-cst , unordered , or
init
The weakest ordering guaranteed by the memory model for
the event.
[[NoTear]]
a Boolean
Whether this event is allowed to be read from multiple read events with equal
range as this event.
[[Block]]
a Shared Data Block
The block the event operates on.
[[ByteIndex]]
a non-negative integer
The byte address of the write in [[Block]] .
[[ElementSize]]
a non-negative integer
The size of the write.
[[Payload]]
a List of
byte values
The List of
byte values to be read by other
events.
Table 98: ReadModifyWriteSharedMemory
Event Fields
These events are introduced by abstract
operations or by methods on the Atomics object.
Some operations may also introduce Synchronize events. A Synchronize event has no fields, and exists
purely to directly constrain the permitted orderings of other events.
In addition to Shared
Data Block and Synchronize events, there are host -specific events.
Let the range of a ReadSharedMemory, WriteSharedMemory, or ReadModifyWriteSharedMemory event be the
Set of contiguous integers from its [[ByteIndex]] to
[[ByteIndex]] + [[ElementSize]] - 1. Two events'
ranges are equal when the events have the same [[Block]] , and the ranges
are element-wise equal. Two events' ranges are overlapping when the events have the same [[Block]] , the ranges are not equal and their intersection is non-empty. Two
events' ranges are disjoint when the events do not have the same [[Block]]
or their ranges are neither equal nor overlapping.
Note 2
Examples of host -specific synchronizing events that should be
accounted for are: sending a SharedArrayBuffer from one agent to another (e.g., by
postMessage in a browser), starting and stopping agents , and communicating within the
agent
cluster via channels other than shared memory. For a particular
execution execution , those events are provided by the host via the host-synchronizes-with strict partial order .
Additionally, hosts
can add host -specific
synchronizing events to execution .[[EventList]] so as to
participate in the is-agent-order-before Relation .
Events are ordered within candidate executions by the relations
defined below.
29.2 Agent Events Records
An Agent Events Record is a Record with the following
fields.
Table 99: Agent Events Record Fields
Field Name
Value
Meaning
[[AgentSignifier]]
an agent
signifier
The agent whose evaluation resulted in this
ordering.
[[EventList]]
a List of
events
Events are appended to the list during evaluation.
[[AgentSynchronizesWith]]
a List of
pairs of Synchronize events
Synchronize
relationships introduced by the operational semantics.
29.3 Chosen Value Records
A Chosen Value Record is a Record with the following
fields.
Table 100: Chosen Value Record Fields
29.4 Candidate Executions
A candidate execution of the evaluation of
an agent
cluster is a Record with the
following fields.
Table 101: Candidate Execution Record Fields
An empty candidate execution is a
candidate execution Record whose fields are empty
Lists .
29.5 Abstract Operations for the Memory Model
29.5.1 EventSet ( execution )
The abstract operation EventSet takes argument execution (a candidate execution ) and returns a Set
of events. It performs the following steps when called:
Let events be an empty Set.
For each Agent Events Record
aer of execution .[[EventsRecords]] , do
For each event E of aer .[[EventList]] , do
Add E to events .
Return events .
29.5.2 SharedDataBlockEventSet ( execution )
The abstract operation SharedDataBlockEventSet takes argument execution (a candidate execution ) and returns a Set
of events. It performs the following steps when called:
Let events be an empty Set.
For each event E of EventSet (execution ), do
If E is a ReadSharedMemory ,
WriteSharedMemory ,
or ReadModifyWriteSharedMemory
event, add E to events .
Return events .
29.5.3 HostEventSet ( execution )
The abstract operation HostEventSet takes argument execution (a candidate execution ) and returns a Set
of events. It performs the following steps when called:
Let events be an empty Set.
For each event E of EventSet (execution ), do
If E is not in SharedDataBlockEventSet (execution ),
add E to events .
Return events .
29.5.4 ComposeWriteEventBytes ( execution ,
byteIndex , Ws )
The abstract operation ComposeWriteEventBytes takes arguments execution (a candidate execution ),
byteIndex (a non-negative integer ), and Ws (a List of either WriteSharedMemory or ReadModifyWriteSharedMemory events)
and returns a List of byte
values . It performs the following steps when called:
Let byteLocation be byteIndex .
Let bytesRead be a new empty List .
For each element W of Ws , do
Assert : W has
byteLocation in its range.
Let payloadIndex be byteLocation - W .[[ByteIndex]] .
If W is a WriteSharedMemory
event, then
Let byte be W .[[Payload]] [payloadIndex ].
Else,
Assert : W is a
ReadModifyWriteSharedMemory
event.
Let bytes be ValueOfReadEvent (execution ,
W ).
Let bytesModified be W .[[ModifyOp]] (bytes , W .[[Payload]] ).
Let byte be
bytesModified [payloadIndex ].
Append byte to bytesRead .
Set byteLocation to byteLocation + 1.
Return bytesRead .
Note 1
The read-modify-write modification [[ModifyOp]] is given by the
function properties on the Atomics object that introduce ReadModifyWriteSharedMemory
events.
Note 2
This abstract operation composes a List of write
events into a List of byte
values . It is used in the event semantics of ReadSharedMemory and
ReadModifyWriteSharedMemory
events.
29.5.5 ValueOfReadEvent ( execution , R )
The abstract operation ValueOfReadEvent takes arguments execution (a candidate execution ) and R (a
ReadSharedMemory or ReadModifyWriteSharedMemory event)
and returns a List of byte
values . It performs the following steps when called:
Let Ws be reads-bytes-from (R ) in
execution .
Assert :
Ws is a List of WriteSharedMemory or
ReadModifyWriteSharedMemory
events with length equal to R .[[ElementSize]] .
Return ComposeWriteEventBytes (execution ,
R .[[ByteIndex]] , Ws ).
29.6 Relations of Candidate Executions
The following relations and mathematical functions are parameterized over a particular candidate
execution and order its events.
29.6.1 is-agent-order-before
For a candidate execution
execution , its is-agent-order-before Relation is the least
Relation on events that satisfies the following.
For events E and D , E is-agent-order-before D in
execution if there is some Agent Events Record
aer in execution .[[EventsRecords]] such that
aer .[[EventList]] contains both E and
D and E is before D in List order of
aer .[[EventList]] .
Note
Each agent
introduces events in a per-agent strict total
order during the evaluation. This is the union of those strict total
orders .
29.6.2 reads-bytes-from
For a candidate execution
execution , its reads-bytes-from function is a mathematical function mapping
events in SharedDataBlockEventSet (execution )
to Lists of events in
SharedDataBlockEventSet (execution )
that satisfies the following conditions.
A candidate execution always admits a
reads-bytes-from function.
29.6.3 reads-from
For a candidate execution
execution , its reads-from Relation is the least
Relation on events that satisfies the following.
29.6.4 host-synchronizes-with
For a candidate execution
execution , its host-synchronizes-with Relation is a host -provided strict partial order on
host -specific events that
satisfies at least the following.
If E host-synchronizes-with D in execution , HostEventSet (execution ) contains
E and D .
There is no cycle in the union of host-synchronizes-with and is-agent-order-before in
execution .
Note 1
For two host -specific events E and D
in a candidate execution
execution , E host-synchronizes-with D in
execution implies E happens-before
D in execution .
Note 2
This Relation allows
the host to
provide additional synchronization mechanisms, such as postMessage between
HTML workers.
29.6.5 synchronizes-with
For a candidate execution
execution , its synchronizes-with Relation is the least
Relation on events that satisfies the following.
For events R and W , W synchronizes-with R in
execution if R reads-from W in
execution , R .[[Order]] is
seq-cst , W .[[Order]] is
seq-cst , and R and W have equal ranges.
For each element eventsRecord of execution .[[EventsRecords]] , the following is true.
For events S and Sw , S synchronizes-with
Sw in execution if eventsRecord .[[AgentSynchronizesWith]] contains (S ,
Sw ).
For events E and D , E synchronizes-with D in
execution if execution .[[HostSynchronizesWith]] contains (E , D ).
Note 1
Owing to convention in memory model literature, in a candidate execution
execution , write events synchronizes-with read events, instead of read events
synchronizes-with write events.
Note 2
In a candidate execution
execution , init events do not participate in this
Relation and are
instead constrained directly by happens-before .
Note 3
In a candidate execution
execution , not all seq-cst events related by reads-from are related by
synchronizes-with. Only events that also have equal ranges are related by
synchronizes-with.
Note 4
For Shared Data Block events
R and W in a candidate
execution execution such that W
synchronizes-with R , R may reads-from other writes
than W .
29.6.6 happens-before
For a candidate execution
execution , its happens-before Relation is the least
Relation on events that satisfies the following.
Note
Because happens-before is a superset of agent -order, a candidate execution is
consistent with the single-thread evaluation semantics of ECMAScript.
29.7 Properties of Valid Executions
29.7.1 Valid Chosen Reads
A candidate execution execution
has valid chosen reads if the following algorithm returns true .
For each ReadSharedMemory or
ReadModifyWriteSharedMemory
event R of SharedDataBlockEventSet (execution ),
do
Let chosenValueRecord be the element of execution .[[ChosenValues]] whose [[Event]] field is R .
Let chosenValue be chosenValueRecord .[[ChosenValue]] .
Let readValue be ValueOfReadEvent (execution ,
R ).
Let chosenLen be the number of elements in chosenValue .
Let readLen be the number of elements in readValue .
If chosenLen ≠ readLen , then
Return false .
If chosenValue [i ] ≠ readValue [i ] for
some integer i in the interval
from 0 (inclusive) to chosenLen (exclusive), then
Return false .
Return true .
29.7.2 Coherent Reads
A candidate execution execution
has coherent reads if the following algorithm returns true .
For each ReadSharedMemory or
ReadModifyWriteSharedMemory
event R of SharedDataBlockEventSet (execution ),
do
Let Ws be reads-bytes-from (R )
in execution .
Let byteLocation be R .[[ByteIndex]] .
For each element W of Ws , do
If R happens-before
W in execution , then
Return false .
If there exists a WriteSharedMemory
or ReadModifyWriteSharedMemory
event V that has byteLocation in its range such
that W happens-before
V in execution and V happens-before
R in execution , then
Return false .
Set byteLocation to byteLocation + 1.
Return true .
29.7.3 Tear Free Reads
A candidate execution execution
has tear free reads if the following algorithm returns true .
For each ReadSharedMemory or
ReadModifyWriteSharedMemory
event R of SharedDataBlockEventSet (execution ),
do
If R .[[NoTear]] is true ,
then
Assert : The remainder of dividing
R .[[ByteIndex]] by R .[[ElementSize]] is 0.
For each event W such that R reads-from W in
execution and W .[[NoTear]] is true , do
If R and W have equal ranges and there
exists an event V such that V and
W have equal ranges, V .[[NoTear]] is true ,
W and V are not the same Shared Data Block
event , and R reads-from
V in execution , then
Return false .
Return true .
Note
An event's [[NoTear]] field is true when that
event was introduced via accessing an integer TypedArray , and
false when introduced via accessing a floating point TypedArray
or DataView.
Intuitively, this requirement says when a memory range is accessed in an aligned fashion
via an integer TypedArray , a single write
event on that range must "win" when in a data race with other write
events with equal ranges. More precisely, this requirement says an aligned read event
cannot read a value composed of bytes from multiple, different write events all with
equal ranges. It is possible, however, for an aligned read event to read from multiple
write events with overlapping ranges.
29.7.4 Sequentially Consistent Atomics
For a candidate execution
execution , is-memory-order-before is a strict total order of all
events in EventSet (execution ) that satisfies the
following.
A candidate execution has sequentially
consistent atomics if it admits an is-memory-order-before Relation .
Note 3
While is-memory-order-before includes all events in EventSet (execution ), those that
are not constrained by happens-before or synchronizes-with in
execution are allowed to occur anywhere in the order.
29.7.5 Valid Executions
A candidate execution execution
is a valid execution (or simply an execution) if all of the following are true.
All programs have at least one valid execution.
29.8 Races
For an execution execution and events E and D that are contained in
SharedDataBlockEventSet (execution ),
E and D are in a race if the following algorithm returns
true .
If E and D are not the same Shared Data Block event , then
If it is not the case that both E happens-before
D in execution and D happens-before E in
execution , then
If E and D are both WriteSharedMemory
or ReadModifyWriteSharedMemory
events and E and D do not have disjoint ranges, then
Return true .
If E reads-from D in
execution or D reads-from
E in execution , then
Return true .
Return false .
29.9 Data Races
For an execution execution and events E and D that are contained in
SharedDataBlockEventSet (execution ),
E and D are in a data race if the following algorithm
returns true .
If E and D are in a race in execution , then
If E .[[Order]] is not
seq-cst or D .[[Order]] is
not seq-cst , then
Return true .
If E and D have overlapping ranges, then
Return true .
Return false .
29.10 Data Race Freedom
An execution execution is data race free if there are no two
events in SharedDataBlockEventSet (execution )
that are in a data
race .
A program is data race free if all its executions are data race free.
The memory
model guarantees sequential consistency of all events for data race free
programs.
29.11 Shared Memory Guidelines
Note 1
The following are guidelines for ECMAScript programmers working with shared memory.
We recommend programs be kept data race free , i.e., make it so that
it is impossible for there to be concurrent non-atomic operations on the same memory
location. Data race free programs have
interleaving semantics where each step in the evaluation semantics of each agent are interleaved with
each other. For data race free programs, it is not
necessary to understand the details of the memory model . The details are
unlikely to build intuition that will help one to better write ECMAScript.
More generally, even if a program is not data race free it may
have predictable behaviour, so long as atomic operations are not involved in any data races
and the operations that race all have the same access size. The simplest way to arrange for
atomics not to be involved in races is to ensure that different memory cells are used by
atomic and non-atomic operations and that atomic accesses of different sizes are not used to
access the same cells at the same time. Effectively, the program should treat shared memory
as strongly typed as much as possible. One still cannot depend on the ordering and timing of
non-atomic accesses that race, but if memory is treated as strongly typed the racing
accesses will not "tear" (bits of their values will not be mixed).
Note 2
The following are guidelines for ECMAScript implementers writing compiler transformations for
programs using shared memory.
It is desirable to allow most program transformations that are valid in a single-agent setting in a
multi-agent setting,
to ensure that the performance of each agent in a multi-agent program is as good as it would be
in a single-agent
setting. Frequently these transformations are hard to judge. We outline some rules about
program transformations that are intended to be taken as normative (in that they are implied
by the memory
model or stronger than what the memory model implies) but
which are likely not exhaustive. These rules are intended to apply to program
transformations that precede the introductions of the events that make up the is-agent-order-before Relation .
Let an agent-order slice be the subset
of the is-agent-order-before Relation pertaining
to a single agent .
Let possible read values of a read event be the set of all values of
ValueOfReadEvent for that event across
all valid executions.
Any transformation of an agent-order slice that is valid in the absence of shared memory is
valid in the presence of shared memory, with the following exceptions.
Atomics are carved in stone : Program transformations must not cause the
seq-cst events in an agent-order slice to be reordered with
its unordered operations, nor its
seq-cst operations to be reordered with each other, nor may a
program transformation remove a seq-cst operation from the
is-agent-order-before Relation .
(In practice, the prohibition on reorderings forces a compiler to assume that every
seq-cst operation is a synchronization and included in the
final is-memory-order-before Relation ,
which it would usually have to assume anyway in the absence of inter-agent program
analysis. It also forces the compiler to assume that every call where the callee's
effects on the memory-order are unknown may contain seq-cst
operations.)
Reads must be stable : Any given shared memory read must only observe a
single value in an execution.
(For example, if what is semantically a single read in the program is executed
multiple times then the program is subsequently allowed to observe only one of the
values read. A transformation known as rematerialization can violate this rule.)
Writes must be stable : All observable writes to shared memory must follow
from program semantics in an execution.
(For example, a transformation may not introduce certain observable writes, such as
by using read-modify-write operations on a larger location to write a smaller datum,
writing a value to memory that the program could not have written, or writing a
just-read value back to the location it was read from, if that location could have
been overwritten by another agent after the read.)
Possible read values must be non-empty : Program transformations cannot cause
the possible read values of a shared memory read to become empty.
(Counterintuitively, this rule in effect restricts transformations on writes, because
writes have force in memory model insofar as to be read
by read events. For example, writes may be moved and coalesced and sometimes
reordered between two seq-cst operations, but the
transformation may not remove every write that updates a location; some write must
be preserved.)
Examples of transformations that remain valid are: merging multiple non-atomic reads from the
same location, reordering non-atomic reads, introducing speculative non-atomic reads,
merging multiple non-atomic writes to the same location, reordering non-atomic writes to
different locations, and hoisting non-atomic reads out of loops even if that affects
termination. Note in general that aliased TypedArrays make it hard to prove that locations
are different.
Note 3
The following are guidelines for ECMAScript implementers generating machine code for shared
memory accesses.
For architectures with memory models no weaker than those of ARM or Power, non-atomic stores
and loads may be compiled to bare stores and loads on the target architecture. Atomic stores
and loads may be compiled down to instructions that guarantee sequential consistency. If no
such instructions exist, memory barriers are to be employed, such as placing barriers on
both sides of a bare store or load. Read-modify-write operations may be compiled to
read-modify-write instructions on the target architecture, such as
LOCK-prefixed instructions on x86, load-exclusive/store-exclusive instructions
on ARM, and load-link/store-conditional instructions on Power.
Specifically, the memory model is intended to allow code
generation as follows.
Every atomic operation in the program is assumed to be necessary.
Atomic operations are never rearranged with each other or with non-atomic operations.
Functions are always assumed to perform atomic operations.
Atomic operations are never implemented as read-modify-write operations on larger data,
but as non-lock-free atomics if the platform does not have atomic operations of the
appropriate size. (We already assume that every platform has normal memory access
operations of every interesting size.)
Naive code generation uses these patterns:
Regular loads and stores compile to single load and store instructions.
Lock-free atomic loads and stores compile to a full (sequentially consistent) fence, a
regular load or store, and a full fence.
Lock-free atomic read-modify-write accesses compile to a full fence, an atomic
read-modify-write instruction sequence, and a full fence.
Non-lock-free atomics compile to a spinlock acquire, a full fence, a series of
non-atomic load and store instructions, a full fence, and a spinlock release.
That mapping is correct so long as an atomic operation on an address range does not race with
a non-atomic write or with an atomic operation of different size. However, that is all we
need: the memory model effectively demotes the atomic
operations involved in a race to non-atomic status. On the other hand, the naive mapping is
quite strong: it allows atomic operations to be used as sequentially consistent fences,
which the memory model does not actually guarantee.
Local improvements to those basic patterns are also allowed, subject to the constraints of
the memory
model . For example:
There are obvious platform-dependent improvements that remove redundant fences. For
example, on x86 the fences around lock-free atomic loads and stores can always be
omitted except for the fence following a store, and no fence is needed for lock-free
read-modify-write instructions, as these all use LOCK-prefixed
instructions. On many platforms there are fences of several strengths, and weaker fences
can be used in certain contexts without destroying sequential consistency.
Most modern platforms support lock-free atomics for all the data sizes required by
ECMAScript atomics. Should non-lock-free atomics be needed, the fences surrounding the
body of the atomic operation can usually be folded into the lock and unlock steps. The
simplest solution for non-lock-free atomics is to have a single lock word per
SharedArrayBuffer.
There are also more complicated platform-dependent local improvements, requiring some
code analysis. For example, two back-to-back fences often have the same effect as a
single fence, so if code is generated for two atomic operations in sequence, only a
single fence need separate them. On x86, even a single fence separating atomic stores
can be omitted, as the fence following a store is only needed to separate the store from
a subsequent load.
Annex A (informative) Grammar Summary
A.1 Lexical Grammar
SourceCharacter ::
any Unicode code point
InputElementDiv ::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
RightBracePunctuator
InputElementRegExp ::
WhiteSpace
LineTerminator
Comment
CommonToken
RightBracePunctuator
RegularExpressionLiteral
InputElementRegExpOrTemplateTail
::
WhiteSpace
LineTerminator
Comment
CommonToken
RegularExpressionLiteral
TemplateSubstitutionTail
InputElementTemplateTail
::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
TemplateSubstitutionTail
InputElementHashbangOrRegExp
::
WhiteSpace
LineTerminator
Comment
CommonToken
HashbangComment
RegularExpressionLiteral
WhiteSpace ::
<TAB>
<VT>
<FF>
<ZWNBSP>
<USP>
LineTerminator ::
<LF>
<CR>
<LS>
<PS>
LineTerminatorSequence
::
<LF>
<CR>
[lookahead ≠ <LF> ]
<LS>
<PS>
<CR>
<LF>
Comment ::
MultiLineComment
SingleLineComment
MultiLineComment ::
/*
MultiLineCommentChars opt
*/
MultiLineCommentChars
::
MultiLineNotAsteriskChar
MultiLineCommentChars opt
*
PostAsteriskCommentChars opt
PostAsteriskCommentChars
::
MultiLineNotForwardSlashOrAsteriskChar
MultiLineCommentChars opt
*
PostAsteriskCommentChars opt
MultiLineNotAsteriskChar
::
SourceCharacter but not
*
MultiLineNotForwardSlashOrAsteriskChar
::
SourceCharacter but not one of
/ or *
SingleLineComment ::
//
SingleLineCommentChars opt
SingleLineCommentChars
::
SingleLineCommentChar
SingleLineCommentChars opt
SingleLineCommentChar
::
SourceCharacter but not
LineTerminator
HashbangComment ::
#!
SingleLineCommentChars opt
CommonToken ::
IdentifierName
PrivateIdentifier
Punctuator
NumericLiteral
StringLiteral
Template
PrivateIdentifier ::
#
IdentifierName
IdentifierName ::
IdentifierStart
IdentifierName
IdentifierPart
IdentifierStart ::
IdentifierStartChar
\
UnicodeEscapeSequence
IdentifierPart ::
IdentifierPartChar
\
UnicodeEscapeSequence
IdentifierStartChar ::
UnicodeIDStart
$
_
IdentifierPartChar ::
UnicodeIDContinue
$
AsciiLetter :: one
of a b c d
e f g h i
j k l m n
o p q r s
t u v w x
y z A B C
D E F G H
I J K L M
N O P Q R
S T U V W
X Y Z
UnicodeIDStart ::
any Unicode code point with the Unicode property “ID_Start”
UnicodeIDContinue ::
any Unicode code point with the Unicode property “ID_Continue”
ReservedWord :: one
of await break case
catch class const continue
debugger default delete do
else enum export extends
false finally for function
if import in instanceof
new null return super
switch this throw true
try typeof var void
while with yield
Punctuator ::
OptionalChainingPunctuator
OtherPunctuator
OptionalChainingPunctuator
::
?.
[lookahead ∉ DecimalDigit ]
OtherPunctuator ::
one of { ( )
[ ] . ... ;
, < > <=
>= == != === !==
+ - * % **
++ -- << >>
>>> & | ^
! ~ && || ??
? : = += -=
*= %= **= <<=
>>= >>>= &= |=
^= &&= ||= ??=
=>
DivPunctuator ::
/
/=
RightBracePunctuator ::
}
NullLiteral ::
null
BooleanLiteral ::
true
false
NumericLiteralSeparator
::
_
NumericLiteral ::
DecimalLiteral
DecimalBigIntegerLiteral
NonDecimalIntegerLiteral [+Sep]
NonDecimalIntegerLiteral [+Sep]
BigIntLiteralSuffix
LegacyOctalIntegerLiteral
DecimalBigIntegerLiteral
::
0
BigIntLiteralSuffix
NonZeroDigit
DecimalDigits [+Sep] opt
BigIntLiteralSuffix
NonZeroDigit
NumericLiteralSeparator
DecimalDigits [+Sep]
BigIntLiteralSuffix
NonDecimalIntegerLiteral [Sep]
::
BinaryIntegerLiteral [?Sep]
OctalIntegerLiteral [?Sep]
HexIntegerLiteral [?Sep]
BigIntLiteralSuffix ::
n
DecimalLiteral ::
DecimalIntegerLiteral
.
DecimalDigits [+Sep] opt
ExponentPart [+Sep] opt
.
DecimalDigits [+Sep]
ExponentPart [+Sep] opt
DecimalIntegerLiteral
ExponentPart [+Sep] opt
DecimalIntegerLiteral
::
0
NonZeroDigit
NonZeroDigit
NumericLiteralSeparator opt
DecimalDigits [+Sep]
NonOctalDecimalIntegerLiteral
DecimalDigits [Sep]
::
DecimalDigit
DecimalDigits [?Sep]
DecimalDigit
[+Sep]
DecimalDigits [+Sep]
NumericLiteralSeparator
DecimalDigit
DecimalDigit :: one
of 0 1 2 3
4 5 6 7 8
9
NonZeroDigit :: one
of 1 2 3 4
5 6 7 8 9
ExponentPart [Sep]
::
ExponentIndicator
SignedInteger [?Sep]
ExponentIndicator ::
one of e E
SignedInteger [Sep]
::
DecimalDigits [?Sep]
+
DecimalDigits [?Sep]
-
DecimalDigits [?Sep]
BinaryIntegerLiteral [Sep]
::
0b
BinaryDigits [?Sep]
0B
BinaryDigits [?Sep]
BinaryDigits [Sep]
::
BinaryDigit
BinaryDigits [?Sep]
BinaryDigit
[+Sep]
BinaryDigits [+Sep]
NumericLiteralSeparator
BinaryDigit
BinaryDigit :: one
of 0 1
OctalIntegerLiteral [Sep]
::
0o
OctalDigits [?Sep]
0O
OctalDigits [?Sep]
OctalDigits [Sep]
::
OctalDigit
OctalDigits [?Sep]
OctalDigit
[+Sep]
OctalDigits [+Sep]
NumericLiteralSeparator
OctalDigit
LegacyOctalIntegerLiteral
::
0
OctalDigit
LegacyOctalIntegerLiteral
OctalDigit
NonOctalDecimalIntegerLiteral
::
0
NonOctalDigit
LegacyOctalLikeDecimalIntegerLiteral
NonOctalDigit
NonOctalDecimalIntegerLiteral
DecimalDigit
LegacyOctalLikeDecimalIntegerLiteral
::
0
OctalDigit
LegacyOctalLikeDecimalIntegerLiteral
OctalDigit
OctalDigit :: one
of 0 1 2 3
4 5 6 7
NonOctalDigit ::
one of 8 9
HexIntegerLiteral [Sep]
::
0x
HexDigits [?Sep]
0X
HexDigits [?Sep]
HexDigits [Sep]
::
HexDigit
HexDigits [?Sep]
HexDigit
[+Sep]
HexDigits [+Sep]
NumericLiteralSeparator
HexDigit
HexDigit :: one
of 0 1 2 3
4 5 6 7 8
9 a b c d
e f A B C
D E F
StringLiteral ::
"
DoubleStringCharacters opt
"
'
SingleStringCharacters opt
'
DoubleStringCharacters
::
DoubleStringCharacter
DoubleStringCharacters opt
SingleStringCharacters
::
SingleStringCharacter
SingleStringCharacters opt
DoubleStringCharacter
::
SourceCharacter but not one of
" or \ or LineTerminator
<LS>
<PS>
\
EscapeSequence
LineContinuation
SingleStringCharacter
::
SourceCharacter but not one of
' or \ or LineTerminator
<LS>
<PS>
\
EscapeSequence
LineContinuation
LineContinuation ::
\
LineTerminatorSequence
EscapeSequence ::
CharacterEscapeSequence
0
[lookahead ∉ DecimalDigit ]
LegacyOctalEscapeSequence
NonOctalDecimalEscapeSequence
HexEscapeSequence
UnicodeEscapeSequence
CharacterEscapeSequence
::
SingleEscapeCharacter
NonEscapeCharacter
SingleEscapeCharacter
:: one of ' "
\ b f n r
t v
NonEscapeCharacter ::
SourceCharacter but not one of
EscapeCharacter or LineTerminator
EscapeCharacter ::
SingleEscapeCharacter
DecimalDigit
x
u
LegacyOctalEscapeSequence
::
0
[lookahead ∈ { 8 , 9 }]
NonZeroOctalDigit
[lookahead ∉ OctalDigit ]
ZeroToThree
OctalDigit
[lookahead ∉ OctalDigit ]
FourToSeven
OctalDigit
ZeroToThree
OctalDigit
OctalDigit
NonZeroOctalDigit ::
OctalDigit but not
0
ZeroToThree :: one
of 0 1 2
3
FourToSeven :: one
of 4 5 6
7
NonOctalDecimalEscapeSequence
:: one of 8
9
HexEscapeSequence ::
x
HexDigit
HexDigit
UnicodeEscapeSequence
::
u
Hex4Digits
u{
CodePoint
}
Hex4Digits ::
HexDigit
HexDigit
HexDigit
HexDigit
RegularExpressionLiteral
::
/
RegularExpressionBody
/
RegularExpressionFlags
RegularExpressionBody
::
RegularExpressionFirstChar
RegularExpressionChars
RegularExpressionChars
::
[empty]
RegularExpressionChars
RegularExpressionChar
RegularExpressionFirstChar
::
RegularExpressionNonTerminator
but not one of * or \ or / or
[
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionChar
::
RegularExpressionNonTerminator
but not one of \ or / or [
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionBackslashSequence
::
\
RegularExpressionNonTerminator
RegularExpressionNonTerminator
::
SourceCharacter but not
LineTerminator
RegularExpressionClass
::
[
RegularExpressionClassChars
]
RegularExpressionClassChars
::
[empty]
RegularExpressionClassChars
RegularExpressionClassChar
RegularExpressionClassChar
::
RegularExpressionNonTerminator
but not one of ] or \
RegularExpressionBackslashSequence
RegularExpressionFlags
::
[empty]
RegularExpressionFlags
IdentifierPartChar
Template ::
NoSubstitutionTemplate
TemplateHead
NoSubstitutionTemplate
::
`
TemplateCharacters opt
`
TemplateHead ::
`
TemplateCharacters opt
${
TemplateSubstitutionTail
::
TemplateMiddle
TemplateTail
TemplateMiddle ::
}
TemplateCharacters opt
${
TemplateTail ::
}
TemplateCharacters opt
`
TemplateCharacters ::
TemplateCharacter
TemplateCharacters opt
TemplateCharacter ::
$
[lookahead ≠ { ]
\
TemplateEscapeSequence
\
NotEscapeSequence
LineContinuation
LineTerminatorSequence
SourceCharacter but not one of
` or \ or $ or LineTerminator
TemplateEscapeSequence
::
CharacterEscapeSequence
0
[lookahead ∉ DecimalDigit ]
HexEscapeSequence
UnicodeEscapeSequence
NotEscapeSequence ::
0
DecimalDigit
DecimalDigit but not
0
x
[lookahead ∉ HexDigit ]
x
HexDigit
[lookahead ∉ HexDigit ]
u
[lookahead ∉ HexDigit ]
[lookahead ≠ { ]
u
HexDigit
[lookahead ∉ HexDigit ]
u
HexDigit
HexDigit
[lookahead ∉ HexDigit ]
u
HexDigit
HexDigit
HexDigit
[lookahead ∉ HexDigit ]
u
{
[lookahead ∉ HexDigit ]
u
{
NotCodePoint
[lookahead ∉ HexDigit ]
u
{
CodePoint
[lookahead ∉ HexDigit ]
[lookahead ≠ } ]
NotCodePoint ::
HexDigits [~Sep]
but only if the MV of HexDigits >
0x10FFFF
CodePoint ::
HexDigits [~Sep]
but only if the MV of HexDigits ≤
0x10FFFF
A.2 Expressions
IdentifierReference [Yield,
Await] :
Identifier
[~Yield]
yield
[~Await]
await
BindingIdentifier [Yield,
Await] :
Identifier
yield
await
LabelIdentifier [Yield,
Await] :
Identifier
[~Yield]
yield
[~Await]
await
Identifier :
IdentifierName but not ReservedWord
PrimaryExpression [Yield,
Await] :
this
IdentifierReference [?Yield,
?Await]
Literal
ArrayLiteral [?Yield,
?Await]
ObjectLiteral [?Yield,
?Await]
FunctionExpression
ClassExpression [?Yield,
?Await]
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral [?Yield, ?Await,
~Tagged]
CoverParenthesizedExpressionAndArrowParameterList [?Yield,
?Await]
CoverParenthesizedExpressionAndArrowParameterList [Yield,
Await] :
(
Expression [+In, ?Yield,
?Await]
)
(
Expression [+In, ?Yield,
?Await]
,
)
(
)
(
...
BindingIdentifier [?Yield,
?Await]
)
(
...
BindingPattern [?Yield,
?Await]
)
(
Expression [+In, ?Yield,
?Await]
,
...
BindingIdentifier [?Yield,
?Await]
)
(
Expression [+In, ?Yield,
?Await]
,
...
BindingPattern [?Yield,
?Await]
)
When processing an instance of the production
PrimaryExpression [Yield,
Await] :
CoverParenthesizedExpressionAndArrowParameterList [?Yield,
?Await]
the interpretation of CoverParenthesizedExpressionAndArrowParameterList
is refined using the following grammar:
ParenthesizedExpression [Yield,
Await] :
(
Expression [+In, ?Yield,
?Await]
)
Literal :
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
ArrayLiteral [Yield,
Await] :
[
Elision opt
]
[
ElementList [?Yield,
?Await]
]
[
ElementList [?Yield,
?Await]
,
Elision opt
]
ElementList [Yield,
Await] :
Elision opt
AssignmentExpression [+In,
?Yield, ?Await]
Elision opt
SpreadElement [?Yield,
?Await]
ElementList [?Yield,
?Await]
,
Elision opt
AssignmentExpression [+In,
?Yield, ?Await]
ElementList [?Yield,
?Await]
,
Elision opt
SpreadElement [?Yield,
?Await]
Elision :
,
Elision
,
SpreadElement [Yield,
Await] :
...
AssignmentExpression [+In,
?Yield, ?Await]
ObjectLiteral [Yield,
Await] :
{
}
{
PropertyDefinitionList [?Yield,
?Await]
}
{
PropertyDefinitionList [?Yield,
?Await]
,
}
PropertyDefinitionList [Yield,
Await] :
PropertyDefinition [?Yield,
?Await]
PropertyDefinitionList [?Yield,
?Await]
,
PropertyDefinition [?Yield,
?Await]
PropertyDefinition [Yield,
Await] :
IdentifierReference [?Yield,
?Await]
CoverInitializedName [?Yield,
?Await]
PropertyName [?Yield,
?Await]
:
AssignmentExpression [+In,
?Yield, ?Await]
MethodDefinition [?Yield,
?Await]
...
AssignmentExpression [+In,
?Yield, ?Await]
PropertyName [Yield,
Await] :
LiteralPropertyName
ComputedPropertyName [?Yield,
?Await]
LiteralPropertyName :
IdentifierName
StringLiteral
NumericLiteral
ComputedPropertyName [Yield,
Await] :
[
AssignmentExpression [+In,
?Yield, ?Await]
]
CoverInitializedName [Yield,
Await] :
IdentifierReference [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await]
Initializer [In, Yield,
Await] :
=
AssignmentExpression [?In,
?Yield, ?Await]
TemplateLiteral [Yield, Await,
Tagged] :
NoSubstitutionTemplate
SubstitutionTemplate [?Yield,
?Await, ?Tagged]
SubstitutionTemplate [Yield,
Await, Tagged] :
TemplateHead
Expression [+In, ?Yield,
?Await]
TemplateSpans [?Yield, ?Await,
?Tagged]
TemplateSpans [Yield, Await,
Tagged] :
TemplateTail
TemplateMiddleList [?Yield,
?Await, ?Tagged]
TemplateTail
TemplateMiddleList [Yield, Await,
Tagged] :
TemplateMiddle
Expression [+In, ?Yield,
?Await]
TemplateMiddleList [?Yield,
?Await, ?Tagged]
TemplateMiddle
Expression [+In, ?Yield,
?Await]
MemberExpression [Yield,
Await] :
PrimaryExpression [?Yield,
?Await]
MemberExpression [?Yield,
?Await]
[
Expression [+In, ?Yield,
?Await]
]
MemberExpression [?Yield,
?Await]
.
IdentifierName
MemberExpression [?Yield,
?Await]
TemplateLiteral [?Yield, ?Await,
+Tagged]
SuperProperty [?Yield,
?Await]
MetaProperty
new
MemberExpression [?Yield,
?Await]
Arguments [?Yield,
?Await]
MemberExpression [?Yield,
?Await]
.
PrivateIdentifier
SuperProperty [Yield,
Await] :
super
[
Expression [+In, ?Yield,
?Await]
]
super
.
IdentifierName
MetaProperty :
NewTarget
ImportMeta
NewTarget :
new
.
target
ImportMeta :
import
.
meta
NewExpression [Yield,
Await] :
MemberExpression [?Yield,
?Await]
new
NewExpression [?Yield,
?Await]
CallExpression [Yield,
Await] :
CoverCallExpressionAndAsyncArrowHead [?Yield,
?Await]
SuperCall [?Yield,
?Await]
ImportCall [?Yield,
?Await]
CallExpression [?Yield,
?Await]
Arguments [?Yield,
?Await]
CallExpression [?Yield,
?Await]
[
Expression [+In, ?Yield,
?Await]
]
CallExpression [?Yield,
?Await]
.
IdentifierName
CallExpression [?Yield,
?Await]
TemplateLiteral [?Yield, ?Await,
+Tagged]
CallExpression [?Yield,
?Await]
.
PrivateIdentifier
When processing an instance of the production
CallExpression [Yield,
Await] :
CoverCallExpressionAndAsyncArrowHead [?Yield,
?Await]
the interpretation of CoverCallExpressionAndAsyncArrowHead
is refined using the following grammar:
CallMemberExpression [Yield,
Await] :
MemberExpression [?Yield,
?Await]
Arguments [?Yield,
?Await]
SuperCall [Yield,
Await] :
super
Arguments [?Yield,
?Await]
ImportCall [Yield,
Await] :
import
(
AssignmentExpression [+In,
?Yield, ?Await]
,opt
)
import
(
AssignmentExpression [+In,
?Yield, ?Await]
,
AssignmentExpression [+In,
?Yield, ?Await]
,opt
)
Arguments [Yield,
Await] :
(
)
(
ArgumentList [?Yield,
?Await]
)
(
ArgumentList [?Yield,
?Await]
,
)
ArgumentList [Yield,
Await] :
AssignmentExpression [+In,
?Yield, ?Await]
...
AssignmentExpression [+In,
?Yield, ?Await]
ArgumentList [?Yield,
?Await]
,
AssignmentExpression [+In,
?Yield, ?Await]
ArgumentList [?Yield,
?Await]
,
...
AssignmentExpression [+In,
?Yield, ?Await]
OptionalExpression [Yield,
Await] :
MemberExpression [?Yield,
?Await]
OptionalChain [?Yield,
?Await]
CallExpression [?Yield,
?Await]
OptionalChain [?Yield,
?Await]
OptionalExpression [?Yield,
?Await]
OptionalChain [?Yield,
?Await]
OptionalChain [Yield,
Await] :
?.
Arguments [?Yield,
?Await]
?.
[
Expression [+In, ?Yield,
?Await]
]
?.
IdentifierName
?.
TemplateLiteral [?Yield, ?Await,
+Tagged]
?.
PrivateIdentifier
OptionalChain [?Yield,
?Await]
Arguments [?Yield,
?Await]
OptionalChain [?Yield,
?Await]
[
Expression [+In, ?Yield,
?Await]
]
OptionalChain [?Yield,
?Await]
.
IdentifierName
OptionalChain [?Yield,
?Await]
TemplateLiteral [?Yield, ?Await,
+Tagged]
OptionalChain [?Yield,
?Await]
.
PrivateIdentifier
LeftHandSideExpression [Yield,
Await] :
NewExpression [?Yield,
?Await]
CallExpression [?Yield,
?Await]
OptionalExpression [?Yield,
?Await]
UpdateExpression [Yield,
Await] :
LeftHandSideExpression [?Yield,
?Await]
LeftHandSideExpression [?Yield,
?Await]
[no LineTerminator
here]
++
LeftHandSideExpression [?Yield,
?Await]
[no LineTerminator
here]
--
++
UnaryExpression [?Yield,
?Await]
--
UnaryExpression [?Yield,
?Await]
UnaryExpression [Yield,
Await] :
UpdateExpression [?Yield,
?Await]
delete
UnaryExpression [?Yield,
?Await]
void
UnaryExpression [?Yield,
?Await]
typeof
UnaryExpression [?Yield,
?Await]
+
UnaryExpression [?Yield,
?Await]
-
UnaryExpression [?Yield,
?Await]
~
UnaryExpression [?Yield,
?Await]
!
UnaryExpression [?Yield,
?Await]
[+Await]
AwaitExpression [?Yield]
ExponentiationExpression [Yield,
Await] :
UnaryExpression [?Yield,
?Await]
UpdateExpression [?Yield,
?Await]
**
ExponentiationExpression [?Yield,
?Await]
MultiplicativeExpression [Yield,
Await] :
ExponentiationExpression [?Yield,
?Await]
MultiplicativeExpression [?Yield,
?Await]
MultiplicativeOperator
ExponentiationExpression [?Yield,
?Await]
MultiplicativeOperator
: one of * /
%
AdditiveExpression [Yield,
Await] :
MultiplicativeExpression [?Yield,
?Await]
AdditiveExpression [?Yield,
?Await]
+
MultiplicativeExpression [?Yield,
?Await]
AdditiveExpression [?Yield,
?Await]
-
MultiplicativeExpression [?Yield,
?Await]
ShiftExpression [Yield,
Await] :
AdditiveExpression [?Yield,
?Await]
ShiftExpression [?Yield,
?Await]
<<
AdditiveExpression [?Yield,
?Await]
ShiftExpression [?Yield,
?Await]
>>
AdditiveExpression [?Yield,
?Await]
ShiftExpression [?Yield,
?Await]
>>>
AdditiveExpression [?Yield,
?Await]
RelationalExpression [In, Yield,
Await] :
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
<
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
>
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
<=
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
>=
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
instanceof
ShiftExpression [?Yield,
?Await]
[+In]
RelationalExpression [+In,
?Yield, ?Await]
in
ShiftExpression [?Yield,
?Await]
[+In]
PrivateIdentifier
in
ShiftExpression [?Yield,
?Await]
EqualityExpression [In, Yield,
Await] :
RelationalExpression [?In,
?Yield, ?Await]
EqualityExpression [?In,
?Yield, ?Await]
==
RelationalExpression [?In,
?Yield, ?Await]
EqualityExpression [?In,
?Yield, ?Await]
!=
RelationalExpression [?In,
?Yield, ?Await]
EqualityExpression [?In,
?Yield, ?Await]
===
RelationalExpression [?In,
?Yield, ?Await]
EqualityExpression [?In,
?Yield, ?Await]
!==
RelationalExpression [?In,
?Yield, ?Await]
BitwiseANDExpression [In, Yield,
Await] :
EqualityExpression [?In,
?Yield, ?Await]
BitwiseANDExpression [?In,
?Yield, ?Await]
&
EqualityExpression [?In,
?Yield, ?Await]
BitwiseXORExpression [In, Yield,
Await] :
BitwiseANDExpression [?In,
?Yield, ?Await]
BitwiseXORExpression [?In,
?Yield, ?Await]
^
BitwiseANDExpression [?In,
?Yield, ?Await]
BitwiseORExpression [In, Yield,
Await] :
BitwiseXORExpression [?In,
?Yield, ?Await]
BitwiseORExpression [?In,
?Yield, ?Await]
|
BitwiseXORExpression [?In,
?Yield, ?Await]
LogicalANDExpression [In, Yield,
Await] :
BitwiseORExpression [?In,
?Yield, ?Await]
LogicalANDExpression [?In,
?Yield, ?Await]
&&
BitwiseORExpression [?In,
?Yield, ?Await]
LogicalORExpression [In, Yield,
Await] :
LogicalANDExpression [?In,
?Yield, ?Await]
LogicalORExpression [?In,
?Yield, ?Await]
||
LogicalANDExpression [?In,
?Yield, ?Await]
CoalesceExpression [In, Yield,
Await] :
CoalesceExpressionHead [?In,
?Yield, ?Await]
??
BitwiseORExpression [?In,
?Yield, ?Await]
CoalesceExpressionHead [In,
Yield, Await] :
CoalesceExpression [?In,
?Yield, ?Await]
BitwiseORExpression [?In,
?Yield, ?Await]
ShortCircuitExpression [In,
Yield, Await] :
LogicalORExpression [?In,
?Yield, ?Await]
CoalesceExpression [?In,
?Yield, ?Await]
ConditionalExpression [In,
Yield, Await] :
ShortCircuitExpression [?In,
?Yield, ?Await]
ShortCircuitExpression [?In,
?Yield, ?Await]
?
AssignmentExpression [+In,
?Yield, ?Await]
:
AssignmentExpression [?In,
?Yield, ?Await]
AssignmentExpression [In, Yield,
Await] :
ConditionalExpression [?In,
?Yield, ?Await]
[+Yield]
YieldExpression [?In,
?Await]
ArrowFunction [?In, ?Yield,
?Await]
AsyncArrowFunction [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
=
AssignmentExpression [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
AssignmentOperator
AssignmentExpression [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
&&=
AssignmentExpression [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
||=
AssignmentExpression [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
??=
AssignmentExpression [?In,
?Yield, ?Await]
AssignmentOperator :
one of *= /= %=
+= -= <<= >>=
>>>= &= ^= |=
**=
In certain circumstances when processing an instance of the production
AssignmentExpression [In,
Yield, Await] :
LeftHandSideExpression [?Yield,
?Await]
=
AssignmentExpression [?In,
?Yield, ?Await]
the interpretation of LeftHandSideExpression is refined using the
following grammar:
AssignmentPattern [Yield,
Await] :
ObjectAssignmentPattern [?Yield,
?Await]
ArrayAssignmentPattern [?Yield,
?Await]
ObjectAssignmentPattern [Yield,
Await] :
{
}
{
AssignmentRestProperty [?Yield,
?Await]
}
{
AssignmentPropertyList [?Yield,
?Await]
}
{
AssignmentPropertyList [?Yield,
?Await]
,
AssignmentRestProperty [?Yield,
?Await] opt
}
ArrayAssignmentPattern [Yield,
Await] :
[
Elision opt
AssignmentRestElement [?Yield,
?Await] opt
]
[
AssignmentElementList [?Yield,
?Await]
]
[
AssignmentElementList [?Yield,
?Await]
,
Elision opt
AssignmentRestElement [?Yield,
?Await] opt
]
AssignmentRestProperty [Yield,
Await] :
...
DestructuringAssignmentTarget [?Yield,
?Await]
AssignmentPropertyList [Yield,
Await] :
AssignmentProperty [?Yield,
?Await]
AssignmentPropertyList [?Yield,
?Await]
,
AssignmentProperty [?Yield,
?Await]
AssignmentElementList [Yield,
Await] :
AssignmentElisionElement [?Yield,
?Await]
AssignmentElementList [?Yield,
?Await]
,
AssignmentElisionElement [?Yield,
?Await]
AssignmentElisionElement [Yield,
Await] :
Elision opt
AssignmentElement [?Yield,
?Await]
AssignmentProperty [Yield,
Await] :
IdentifierReference [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
PropertyName [?Yield,
?Await]
:
AssignmentElement [?Yield,
?Await]
AssignmentElement [Yield,
Await] :
DestructuringAssignmentTarget [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
AssignmentRestElement [Yield,
Await] :
...
DestructuringAssignmentTarget [?Yield,
?Await]
DestructuringAssignmentTarget [Yield,
Await] :
LeftHandSideExpression [?Yield,
?Await]
Expression [In, Yield,
Await] :
AssignmentExpression [?In,
?Yield, ?Await]
Expression [?In, ?Yield,
?Await]
,
AssignmentExpression [?In,
?Yield, ?Await]
A.3 Statements
Statement [Yield, Await,
Return] :
BlockStatement [?Yield, ?Await,
?Return]
VariableStatement [?Yield,
?Await]
EmptyStatement
ExpressionStatement [?Yield,
?Await]
IfStatement [?Yield, ?Await,
?Return]
BreakableStatement [?Yield,
?Await, ?Return]
ContinueStatement [?Yield,
?Await]
BreakStatement [?Yield,
?Await]
[+Return]
ReturnStatement [?Yield,
?Await]
WithStatement [?Yield, ?Await,
?Return]
LabelledStatement [?Yield,
?Await, ?Return]
ThrowStatement [?Yield,
?Await]
TryStatement [?Yield, ?Await,
?Return]
DebuggerStatement
Declaration [Yield,
Await] :
HoistableDeclaration [?Yield,
?Await, ~Default]
ClassDeclaration [?Yield, ?Await,
~Default]
LexicalDeclaration [+In,
?Yield, ?Await]
HoistableDeclaration [Yield,
Await, Default] :
FunctionDeclaration [?Yield,
?Await, ?Default]
GeneratorDeclaration [?Yield,
?Await, ?Default]
AsyncFunctionDeclaration [?Yield,
?Await, ?Default]
AsyncGeneratorDeclaration [?Yield,
?Await, ?Default]
BreakableStatement [Yield, Await,
Return] :
IterationStatement [?Yield,
?Await, ?Return]
SwitchStatement [?Yield, ?Await,
?Return]
BlockStatement [Yield, Await,
Return] :
Block [?Yield, ?Await,
?Return]
Block [Yield,
Await, Return] :
{
StatementList [?Yield, ?Await,
?Return] opt
}
StatementList [Yield, Await,
Return] :
StatementListItem [?Yield,
?Await, ?Return]
StatementList [?Yield, ?Await,
?Return]
StatementListItem [?Yield,
?Await, ?Return]
StatementListItem [Yield, Await,
Return] :
Statement [?Yield, ?Await,
?Return]
Declaration [?Yield,
?Await]
LexicalDeclaration [In, Yield,
Await] :
LetOrConst
BindingList [?In, ?Yield,
?Await]
;
LetOrConst :
let
const
BindingList [In, Yield,
Await] :
LexicalBinding [?In, ?Yield,
?Await]
BindingList [?In, ?Yield,
?Await]
,
LexicalBinding [?In, ?Yield,
?Await]
LexicalBinding [In, Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
Initializer [?In, ?Yield,
?Await] opt
BindingPattern [?Yield,
?Await]
Initializer [?In, ?Yield,
?Await]
VariableStatement [Yield,
Await] :
var
VariableDeclarationList [+In,
?Yield, ?Await]
;
VariableDeclarationList [In,
Yield, Await] :
VariableDeclaration [?In,
?Yield, ?Await]
VariableDeclarationList [?In,
?Yield, ?Await]
,
VariableDeclaration [?In,
?Yield, ?Await]
VariableDeclaration [In, Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
Initializer [?In, ?Yield,
?Await] opt
BindingPattern [?Yield,
?Await]
Initializer [?In, ?Yield,
?Await]
BindingPattern [Yield,
Await] :
ObjectBindingPattern [?Yield,
?Await]
ArrayBindingPattern [?Yield,
?Await]
ObjectBindingPattern [Yield,
Await] :
{
}
{
BindingRestProperty [?Yield,
?Await]
}
{
BindingPropertyList [?Yield,
?Await]
}
{
BindingPropertyList [?Yield,
?Await]
,
BindingRestProperty [?Yield,
?Await] opt
}
ArrayBindingPattern [Yield,
Await] :
[
Elision opt
BindingRestElement [?Yield,
?Await] opt
]
[
BindingElementList [?Yield,
?Await]
]
[
BindingElementList [?Yield,
?Await]
,
Elision opt
BindingRestElement [?Yield,
?Await] opt
]
BindingRestProperty [Yield,
Await] :
...
BindingIdentifier [?Yield,
?Await]
BindingPropertyList [Yield,
Await] :
BindingProperty [?Yield,
?Await]
BindingPropertyList [?Yield,
?Await]
,
BindingProperty [?Yield,
?Await]
BindingElementList [Yield,
Await] :
BindingElisionElement [?Yield,
?Await]
BindingElementList [?Yield,
?Await]
,
BindingElisionElement [?Yield,
?Await]
BindingElisionElement [Yield,
Await] :
Elision opt
BindingElement [?Yield,
?Await]
BindingProperty [Yield,
Await] :
SingleNameBinding [?Yield,
?Await]
PropertyName [?Yield,
?Await]
:
BindingElement [?Yield,
?Await]
BindingElement [Yield,
Await] :
SingleNameBinding [?Yield,
?Await]
BindingPattern [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
SingleNameBinding [Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
BindingRestElement [Yield,
Await] :
...
BindingIdentifier [?Yield,
?Await]
...
BindingPattern [?Yield,
?Await]
EmptyStatement :
;
ExpressionStatement [Yield,
Await] :
[lookahead ∉ { { , function , async
[no LineTerminator
here]
function , class , let
[ }]
Expression [+In, ?Yield,
?Await]
;
IfStatement [Yield, Await,
Return] :
if
(
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
else
Statement [?Yield, ?Await,
?Return]
if
(
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
[lookahead ≠ else ]
IterationStatement [Yield, Await,
Return] :
DoWhileStatement [?Yield, ?Await,
?Return]
WhileStatement [?Yield, ?Await,
?Return]
ForStatement [?Yield, ?Await,
?Return]
ForInOfStatement [?Yield, ?Await,
?Return]
DoWhileStatement [Yield, Await,
Return] :
do
Statement [?Yield, ?Await,
?Return]
while
(
Expression [+In, ?Yield,
?Await]
)
;
WhileStatement [Yield, Await,
Return] :
while
(
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
ForStatement [Yield, Await,
Return] :
for
(
[lookahead ≠ let
[ ]
Expression [~In, ?Yield,
?Await] opt
;
Expression [+In, ?Yield,
?Await] opt
;
Expression [+In, ?Yield,
?Await] opt
)
Statement [?Yield, ?Await,
?Return]
for
(
var
VariableDeclarationList [~In,
?Yield, ?Await]
;
Expression [+In, ?Yield,
?Await] opt
;
Expression [+In, ?Yield,
?Await] opt
)
Statement [?Yield, ?Await,
?Return]
for
(
LexicalDeclaration [~In,
?Yield, ?Await]
Expression [+In, ?Yield,
?Await] opt
;
Expression [+In, ?Yield,
?Await] opt
)
Statement [?Yield, ?Await,
?Return]
ForInOfStatement [Yield, Await,
Return] :
for
(
[lookahead ≠ let
[ ]
LeftHandSideExpression [?Yield,
?Await]
in
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
var
ForBinding [?Yield,
?Await]
in
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
ForDeclaration [?Yield,
?Await]
in
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
[lookahead ∉ { let , async
of }]
LeftHandSideExpression [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
var
ForBinding [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
ForDeclaration [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
[+Await]
for
await
(
[lookahead ≠ let ]
LeftHandSideExpression [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
[+Await]
for
await
(
var
ForBinding [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
[+Await]
for
await
(
ForDeclaration [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
ForDeclaration [Yield,
Await] :
LetOrConst
ForBinding [?Yield,
?Await]
ForBinding [Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
BindingPattern [?Yield,
?Await]
ContinueStatement [Yield,
Await] :
continue
;
continue
[no LineTerminator
here]
LabelIdentifier [?Yield,
?Await]
;
BreakStatement [Yield,
Await] :
break
;
break
[no LineTerminator
here]
LabelIdentifier [?Yield,
?Await]
;
ReturnStatement [Yield,
Await] :
return
;
return
[no LineTerminator
here]
Expression [+In, ?Yield,
?Await]
;
WithStatement [Yield, Await,
Return] :
with
(
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
SwitchStatement [Yield, Await,
Return] :
switch
(
Expression [+In, ?Yield,
?Await]
)
CaseBlock [?Yield, ?Await,
?Return]
CaseBlock [Yield, Await,
Return] :
{
CaseClauses [?Yield, ?Await,
?Return] opt
}
{
CaseClauses [?Yield, ?Await,
?Return] opt
DefaultClause [?Yield, ?Await,
?Return]
CaseClauses [?Yield, ?Await,
?Return] opt
}
CaseClauses [Yield, Await,
Return] :
CaseClause [?Yield, ?Await,
?Return]
CaseClauses [?Yield, ?Await,
?Return]
CaseClause [?Yield, ?Await,
?Return]
CaseClause [Yield, Await,
Return] :
case
Expression [+In, ?Yield,
?Await]
:
StatementList [?Yield, ?Await,
?Return] opt
DefaultClause [Yield, Await,
Return] :
default
:
StatementList [?Yield, ?Await,
?Return] opt
LabelledStatement [Yield, Await,
Return] :
LabelIdentifier [?Yield,
?Await]
:
LabelledItem [?Yield, ?Await,
?Return]
LabelledItem [Yield, Await,
Return] :
Statement [?Yield, ?Await,
?Return]
FunctionDeclaration [?Yield,
?Await, ~Default]
ThrowStatement [Yield,
Await] :
throw
[no LineTerminator
here]
Expression [+In, ?Yield,
?Await]
;
TryStatement [Yield, Await,
Return] :
try
Block [?Yield, ?Await,
?Return]
Catch [?Yield, ?Await,
?Return]
try
Block [?Yield, ?Await,
?Return]
Finally [?Yield, ?Await,
?Return]
try
Block [?Yield, ?Await,
?Return]
Catch [?Yield, ?Await,
?Return]
Finally [?Yield, ?Await,
?Return]
Catch [Yield,
Await, Return] :
catch
(
CatchParameter [?Yield,
?Await]
)
Block [?Yield, ?Await,
?Return]
catch
Block [?Yield, ?Await,
?Return]
Finally [Yield, Await,
Return] :
finally
Block [?Yield, ?Await,
?Return]
CatchParameter [Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
BindingPattern [?Yield,
?Await]
DebuggerStatement :
debugger
;
A.4 Functions and Classes
UniqueFormalParameters [Yield,
Await] :
FormalParameters [?Yield,
?Await]
FormalParameters [Yield,
Await] :
[empty]
FunctionRestParameter [?Yield,
?Await]
FormalParameterList [?Yield,
?Await]
FormalParameterList [?Yield,
?Await]
,
FormalParameterList [?Yield,
?Await]
,
FunctionRestParameter [?Yield,
?Await]
FormalParameterList [Yield,
Await] :
FormalParameter [?Yield,
?Await]
FormalParameterList [?Yield,
?Await]
,
FormalParameter [?Yield,
?Await]
FunctionRestParameter [Yield,
Await] :
BindingRestElement [?Yield,
?Await]
FormalParameter [Yield,
Await] :
BindingElement [?Yield,
?Await]
FunctionDeclaration [Yield, Await,
Default] :
function
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [~Yield,
~Await]
)
{
FunctionBody [~Yield,
~Await]
}
[+Default]
function
(
FormalParameters [~Yield,
~Await]
)
{
FunctionBody [~Yield,
~Await]
}
FunctionExpression :
function
BindingIdentifier [~Yield,
~Await] opt
(
FormalParameters [~Yield,
~Await]
)
{
FunctionBody [~Yield,
~Await]
}
FunctionBody [Yield,
Await] :
FunctionStatementList [?Yield,
?Await]
FunctionStatementList [Yield,
Await] :
StatementList [?Yield, ?Await,
+Return] opt
ArrowFunction [In, Yield,
Await] :
ArrowParameters [?Yield,
?Await]
[no LineTerminator
here]
=>
ConciseBody [?In]
ArrowParameters [Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
CoverParenthesizedExpressionAndArrowParameterList [?Yield,
?Await]
ConciseBody [In]
:
[lookahead ≠ { ]
ExpressionBody [?In,
~Await]
{
FunctionBody [~Yield,
~Await]
}
ExpressionBody [In,
Await] :
AssignmentExpression [?In,
~Yield, ?Await]
When processing an instance of the production
ArrowParameters [Yield,
Await] :
CoverParenthesizedExpressionAndArrowParameterList [?Yield,
?Await]
the interpretation of CoverParenthesizedExpressionAndArrowParameterList
is refined using the following grammar:
ArrowFormalParameters [Yield,
Await] :
(
UniqueFormalParameters [?Yield,
?Await]
)
AsyncArrowFunction [In, Yield,
Await] :
async
[no LineTerminator
here]
AsyncArrowBindingIdentifier [?Yield]
[no LineTerminator
here]
=>
AsyncConciseBody [?In]
CoverCallExpressionAndAsyncArrowHead [?Yield,
?Await]
[no LineTerminator
here]
=>
AsyncConciseBody [?In]
AsyncConciseBody [In]
:
[lookahead ≠ { ]
ExpressionBody [?In,
+Await]
{
AsyncFunctionBody
}
AsyncArrowBindingIdentifier [Yield]
:
BindingIdentifier [?Yield,
+Await]
CoverCallExpressionAndAsyncArrowHead [Yield,
Await] :
MemberExpression [?Yield,
?Await]
Arguments [?Yield,
?Await]
When processing an instance of the production
AsyncArrowFunction [In, Yield,
Await] :
CoverCallExpressionAndAsyncArrowHead [?Yield,
?Await]
[no LineTerminator
here]
=>
AsyncConciseBody [?In]
the interpretation of CoverCallExpressionAndAsyncArrowHead
is refined using the following grammar:
AsyncArrowHead :
async
[no LineTerminator
here]
ArrowFormalParameters [~Yield,
+Await]
MethodDefinition [Yield,
Await] :
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [~Yield,
~Await]
)
{
FunctionBody [~Yield,
~Await]
}
GeneratorMethod [?Yield,
?Await]
AsyncMethod [?Yield,
?Await]
AsyncGeneratorMethod [?Yield,
?Await]
get
ClassElementName [?Yield,
?Await]
(
)
{
FunctionBody [~Yield,
~Await]
}
set
ClassElementName [?Yield,
?Await]
(
PropertySetParameterList
)
{
FunctionBody [~Yield,
~Await]
}
PropertySetParameterList
:
FormalParameter [~Yield,
~Await]
GeneratorDeclaration [Yield,
Await, Default] :
function
*
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [+Yield,
~Await]
)
{
GeneratorBody
}
[+Default]
function
*
(
FormalParameters [+Yield,
~Await]
)
{
GeneratorBody
}
GeneratorExpression :
function
*
BindingIdentifier [+Yield,
~Await] opt
(
FormalParameters [+Yield,
~Await]
)
{
GeneratorBody
}
GeneratorMethod [Yield,
Await] :
*
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [+Yield,
~Await]
)
{
GeneratorBody
}
GeneratorBody :
FunctionBody [+Yield,
~Await]
YieldExpression [In,
Await] :
yield
yield
[no LineTerminator
here]
AssignmentExpression [?In,
+Yield, ?Await]
yield
[no LineTerminator
here]
*
AssignmentExpression [?In,
+Yield, ?Await]
AsyncGeneratorDeclaration [Yield,
Await, Default] :
async
[no LineTerminator
here]
function
*
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
[+Default]
async
[no LineTerminator
here]
function
*
(
FormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression
:
async
[no LineTerminator
here]
function
*
BindingIdentifier [+Yield,
+Await] opt
(
FormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorMethod [Yield,
Await] :
async
[no LineTerminator
here]
*
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorBody :
FunctionBody [+Yield,
+Await]
AsyncFunctionDeclaration [Yield,
Await, Default] :
async
[no LineTerminator
here]
function
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
[+Default]
async
[no LineTerminator
here]
function
(
FormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
AsyncFunctionExpression
:
async
[no LineTerminator
here]
function
BindingIdentifier [~Yield,
+Await] opt
(
FormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
AsyncMethod [Yield,
Await] :
async
[no LineTerminator
here]
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
AsyncFunctionBody :
FunctionBody [~Yield,
+Await]
AwaitExpression [Yield]
:
await
UnaryExpression [?Yield,
+Await]
ClassDeclaration [Yield, Await,
Default] :
class
BindingIdentifier [?Yield,
?Await]
ClassTail [?Yield,
?Await]
[+Default]
class
ClassTail [?Yield,
?Await]
ClassExpression [Yield,
Await] :
class
BindingIdentifier [?Yield,
?Await] opt
ClassTail [?Yield,
?Await]
ClassTail [Yield,
Await] :
ClassHeritage [?Yield,
?Await] opt
{
ClassBody [?Yield,
?Await] opt
}
ClassHeritage [Yield,
Await] :
extends
LeftHandSideExpression [?Yield,
?Await]
ClassBody [Yield,
Await] :
ClassElementList [?Yield,
?Await]
ClassElementList [Yield,
Await] :
ClassElement [?Yield,
?Await]
ClassElementList [?Yield,
?Await]
ClassElement [?Yield,
?Await]
ClassElement [Yield,
Await] :
MethodDefinition [?Yield,
?Await]
static
MethodDefinition [?Yield,
?Await]
FieldDefinition [?Yield,
?Await]
;
static
FieldDefinition [?Yield,
?Await]
;
ClassStaticBlock
;
FieldDefinition [Yield,
Await] :
ClassElementName [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
ClassElementName [Yield,
Await] :
PropertyName [?Yield,
?Await]
PrivateIdentifier
ClassStaticBlock :
static
{
ClassStaticBlockBody
}
ClassStaticBlockBody :
ClassStaticBlockStatementList
ClassStaticBlockStatementList
:
StatementList [~Yield, +Await,
~Return] opt
A.5 Scripts and Modules
Script :
ScriptBody opt
ScriptBody :
StatementList [~Yield, ~Await,
~Return]
Module :
ModuleBody opt
ModuleBody :
ModuleItemList
ModuleItemList :
ModuleItem
ModuleItemList
ModuleItem
ModuleItem :
ImportDeclaration
ExportDeclaration
StatementListItem [~Yield,
+Await, ~Return]
ModuleExportName :
IdentifierName
StringLiteral
ImportDeclaration :
import
ImportClause
FromClause
WithClause opt
;
import
ModuleSpecifier
WithClause opt
;
ImportClause :
ImportedDefaultBinding
NameSpaceImport
NamedImports
ImportedDefaultBinding
,
NameSpaceImport
ImportedDefaultBinding
,
NamedImports
ImportedDefaultBinding
:
ImportedBinding
NameSpaceImport :
*
as
ImportedBinding
NamedImports :
{
}
{
ImportsList
}
{
ImportsList
,
}
FromClause :
from
ModuleSpecifier
ImportsList :
ImportSpecifier
ImportsList
,
ImportSpecifier
ImportSpecifier :
ImportedBinding
ModuleExportName
as
ImportedBinding
ModuleSpecifier :
StringLiteral
ImportedBinding :
BindingIdentifier [~Yield,
+Await]
WithClause :
with
{
}
with
{
WithEntries
,opt
}
WithEntries :
AttributeKey
:
StringLiteral
AttributeKey
:
StringLiteral
,
WithEntries
AttributeKey :
IdentifierName
StringLiteral
ExportDeclaration :
export
ExportFromClause
FromClause
WithClause opt
;
export
NamedExports
;
export
VariableStatement [~Yield,
+Await]
export
Declaration [~Yield,
+Await]
export
default
HoistableDeclaration [~Yield,
+Await, +Default]
export
default
ClassDeclaration [~Yield, +Await,
+Default]
export
default
[lookahead ∉ { function , async
[no LineTerminator
here]
function , class }]
AssignmentExpression [+In,
~Yield, +Await]
;
ExportFromClause :
*
*
as
ModuleExportName
NamedExports
NamedExports :
{
}
{
ExportsList
}
{
ExportsList
,
}
ExportsList :
ExportSpecifier
ExportsList
,
ExportSpecifier
ExportSpecifier :
ModuleExportName
ModuleExportName
as
ModuleExportName
A.6 Number Conversions
StringNumericLiteral
:::
StrWhiteSpace opt
StrWhiteSpace opt
StrNumericLiteral
StrWhiteSpace opt
StrWhiteSpace :::
StrWhiteSpaceChar
StrWhiteSpace opt
StrWhiteSpaceChar :::
WhiteSpace
LineTerminator
StrNumericLiteral :::
StrDecimalLiteral
NonDecimalIntegerLiteral [~Sep]
StrDecimalLiteral :::
StrUnsignedDecimalLiteral
+
StrUnsignedDecimalLiteral
-
StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral
:::
Infinity
DecimalDigits [~Sep]
.
DecimalDigits [~Sep] opt
ExponentPart [~Sep] opt
.
DecimalDigits [~Sep]
ExponentPart [~Sep] opt
DecimalDigits [~Sep]
ExponentPart [~Sep] opt
All grammar symbols not explicitly defined by the StringNumericLiteral grammar have the
definitions used in the Lexical Grammar for numeric literals .
StringIntegerLiteral
:::
StrWhiteSpace opt
StrWhiteSpace opt
StrIntegerLiteral
StrWhiteSpace opt
StrIntegerLiteral :::
SignedInteger [~Sep]
NonDecimalIntegerLiteral [~Sep]
A.7 Time Zone Offset String Format
UTCOffset :::
ASCIISign
Hour
ASCIISign
Hour
HourSubcomponents [+Extended]
ASCIISign
Hour
HourSubcomponents [~Extended]
ASCIISign ::: one
of + -
Hour :::
0
DecimalDigit
1
DecimalDigit
20
21
22
23
HourSubcomponents [Extended]
:::
TimeSeparator [?Extended]
MinuteSecond
TimeSeparator [?Extended]
MinuteSecond
TimeSeparator [?Extended]
MinuteSecond
TemporalDecimalFraction opt
TimeSeparator [Extended]
::: [+Extended]
:
[~Extended]
[empty]
MinuteSecond :::
0
DecimalDigit
1
DecimalDigit
2
DecimalDigit
3
DecimalDigit
4
DecimalDigit
5
DecimalDigit
TemporalDecimalFraction
:::
TemporalDecimalSeparator
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
::: one of .
,
A.8 Regular Expressions
Pattern [UnicodeMode, UnicodeSetsMode,
NamedCaptureGroups] ::
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Disjunction [UnicodeMode, UnicodeSetsMode,
NamedCaptureGroups] ::
Alternative [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Alternative [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
|
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Alternative [UnicodeMode, UnicodeSetsMode,
NamedCaptureGroups] ::
[empty]
Alternative [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Term [?UnicodeMode, ?UnicodeSetsMode,
?NamedCaptureGroups]
Term [UnicodeMode, UnicodeSetsMode,
NamedCaptureGroups] ::
Assertion [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Atom [?UnicodeMode, ?UnicodeSetsMode,
?NamedCaptureGroups]
Atom [?UnicodeMode, ?UnicodeSetsMode,
?NamedCaptureGroups]
Quantifier
Assertion [UnicodeMode, UnicodeSetsMode,
NamedCaptureGroups] ::
^
$
\b
\B
(?=
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?!
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?<=
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?<!
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
Quantifier ::
QuantifierPrefix
QuantifierPrefix
?
QuantifierPrefix ::
*
+
?
{
DecimalDigits [~Sep]
}
{
DecimalDigits [~Sep]
,}
{
DecimalDigits [~Sep]
,
DecimalDigits [~Sep]
}
Atom [UnicodeMode, UnicodeSetsMode,
NamedCaptureGroups] ::
PatternCharacter
.
\
AtomEscape [?UnicodeMode,
?NamedCaptureGroups]
CharacterClass [?UnicodeMode,
?UnicodeSetsMode]
(
GroupSpecifier [?UnicodeMode] opt
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?
RegularExpressionModifiers
:
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?
RegularExpressionModifiers
-
RegularExpressionModifiers
:
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
RegularExpressionModifiers
::
[empty]
RegularExpressionModifiers
RegularExpressionModifier
RegularExpressionModifier
:: one of i m
s
SyntaxCharacter ::
one of ^ $ \
. * + ? (
) [ ] { }
|
PatternCharacter ::
SourceCharacter but not
SyntaxCharacter
AtomEscape [UnicodeMode,
NamedCaptureGroups] ::
DecimalEscape
CharacterClassEscape [?UnicodeMode]
CharacterEscape [?UnicodeMode]
[+NamedCaptureGroups]
k
GroupName [?UnicodeMode]
CharacterEscape [UnicodeMode]
::
ControlEscape
c
AsciiLetter
0
[lookahead ∉ DecimalDigit ]
HexEscapeSequence
RegExpUnicodeEscapeSequence [?UnicodeMode]
IdentityEscape [?UnicodeMode]
ControlEscape ::
one of f n r
t v
GroupSpecifier [UnicodeMode]
::
?
GroupName [?UnicodeMode]
GroupName [UnicodeMode]
::
<
RegExpIdentifierName [?UnicodeMode]
>
RegExpIdentifierName [UnicodeMode]
::
RegExpIdentifierStart [?UnicodeMode]
RegExpIdentifierName [?UnicodeMode]
RegExpIdentifierPart [?UnicodeMode]
RegExpIdentifierStart [UnicodeMode]
::
IdentifierStartChar
\
RegExpUnicodeEscapeSequence [+UnicodeMode]
[~UnicodeMode]
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpIdentifierPart [UnicodeMode]
::
IdentifierPartChar
\
RegExpUnicodeEscapeSequence [+UnicodeMode]
[~UnicodeMode]
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpUnicodeEscapeSequence [UnicodeMode]
:: [+UnicodeMode]
u
HexLeadSurrogate
\u
HexTrailSurrogate
[+UnicodeMode]
u
HexLeadSurrogate
[+UnicodeMode]
u
HexTrailSurrogate
[+UnicodeMode]
u
HexNonSurrogate
[~UnicodeMode]
u
Hex4Digits
[+UnicodeMode]
u{
CodePoint
}
UnicodeLeadSurrogate ::
any Unicode code point in the inclusive interval from U+D800 to U+DBFF
UnicodeTrailSurrogate
::
any Unicode code point in the inclusive interval from U+DC00 to U+DFFF
Each \u HexTrailSurrogate for which the choice of
associated u HexLeadSurrogate is ambiguous shall be associated
with the nearest possible u HexLeadSurrogate that would otherwise have no
corresponding \u HexTrailSurrogate .
HexLeadSurrogate ::
Hex4Digits
but only if the MV of Hex4Digits is in
the inclusive
interval from 0xD800 to 0xDBFF
HexTrailSurrogate ::
Hex4Digits
but only if the MV of Hex4Digits is in
the inclusive
interval from 0xDC00 to 0xDFFF
HexNonSurrogate ::
Hex4Digits
but only if the MV of Hex4Digits is
not in the inclusive
interval from 0xD800 to 0xDFFF
IdentityEscape [UnicodeMode]
:: [+UnicodeMode]
SyntaxCharacter
[+UnicodeMode]
/
[~UnicodeMode]
SourceCharacter but not
UnicodeIDContinue
DecimalEscape ::
NonZeroDigit
DecimalDigits [~Sep] opt
[lookahead ∉ DecimalDigit ]
CharacterClassEscape [UnicodeMode]
::
d
D
s
S
w
W
[+UnicodeMode]
p{
UnicodePropertyValueExpression
}
[+UnicodeMode]
P{
UnicodePropertyValueExpression
}
UnicodePropertyValueExpression
::
UnicodePropertyName
=
UnicodePropertyValue
LoneUnicodePropertyNameOrValue
UnicodePropertyName ::
UnicodePropertyNameCharacters
UnicodePropertyNameCharacters
::
UnicodePropertyNameCharacter
UnicodePropertyNameCharacters opt
UnicodePropertyValue ::
UnicodePropertyValueCharacters
LoneUnicodePropertyNameOrValue
::
UnicodePropertyValueCharacters
UnicodePropertyValueCharacters
::
UnicodePropertyValueCharacter
UnicodePropertyValueCharacters opt
UnicodePropertyValueCharacter
::
UnicodePropertyNameCharacter
DecimalDigit
UnicodePropertyNameCharacter
::
AsciiLetter
_
CharacterClass [UnicodeMode,
UnicodeSetsMode] ::
[
[lookahead ≠ ^ ]
ClassContents [?UnicodeMode,
?UnicodeSetsMode]
]
[^
ClassContents [?UnicodeMode,
?UnicodeSetsMode]
]
ClassContents [UnicodeMode,
UnicodeSetsMode] ::
[empty]
[~UnicodeSetsMode]
NonemptyClassRanges [?UnicodeMode]
[+UnicodeSetsMode]
ClassSetExpression
NonemptyClassRanges [UnicodeMode]
::
ClassAtom [?UnicodeMode]
ClassAtom [?UnicodeMode]
NonemptyClassRangesNoDash [?UnicodeMode]
ClassAtom [?UnicodeMode]
-
ClassAtom [?UnicodeMode]
ClassContents [?UnicodeMode,
~UnicodeSetsMode]
NonemptyClassRangesNoDash [UnicodeMode]
::
ClassAtom [?UnicodeMode]
ClassAtomNoDash [?UnicodeMode]
NonemptyClassRangesNoDash [?UnicodeMode]
ClassAtomNoDash [?UnicodeMode]
-
ClassAtom [?UnicodeMode]
ClassContents [?UnicodeMode,
~UnicodeSetsMode]
ClassAtom [UnicodeMode]
::
-
ClassAtomNoDash [?UnicodeMode]
ClassAtomNoDash [UnicodeMode]
::
SourceCharacter but not one of
\ or ] or -
\
ClassEscape [?UnicodeMode]
ClassEscape [UnicodeMode]
::
b
[+UnicodeMode]
-
CharacterClassEscape [?UnicodeMode]
CharacterEscape [?UnicodeMode]
ClassSetExpression ::
ClassUnion
ClassIntersection
ClassSubtraction
ClassUnion ::
ClassSetRange
ClassUnion opt
ClassSetOperand
ClassUnion opt
ClassIntersection ::
ClassSetOperand
&&
[lookahead ≠ & ]
ClassSetOperand
ClassIntersection
&&
[lookahead ≠ & ]
ClassSetOperand
ClassSubtraction ::
ClassSetOperand
--
ClassSetOperand
ClassSubtraction
--
ClassSetOperand
ClassSetRange ::
ClassSetCharacter
-
ClassSetCharacter
ClassSetOperand ::
NestedClass
ClassStringDisjunction
ClassSetCharacter
NestedClass ::
[
[lookahead ≠ ^ ]
ClassContents [+UnicodeMode,
+UnicodeSetsMode]
]
[^
ClassContents [+UnicodeMode,
+UnicodeSetsMode]
]
\
CharacterClassEscape [+UnicodeMode]
ClassStringDisjunction
::
\q{
ClassStringDisjunctionContents
}
ClassStringDisjunctionContents
::
ClassString
ClassString
|
ClassStringDisjunctionContents
ClassString ::
[empty]
NonEmptyClassString
NonEmptyClassString ::
ClassSetCharacter
NonEmptyClassString opt
ClassSetCharacter ::
[lookahead ∉ ClassSetReservedDoublePunctuator ]
SourceCharacter but not
ClassSetSyntaxCharacter
\
CharacterEscape [+UnicodeMode]
\
ClassSetReservedPunctuator
\b
ClassSetReservedDoublePunctuator
:: one of &&
!! ## $$ %% **
++ ,, .. :: ;;
<< == >> ??
@@ ^^ `` ~~
ClassSetSyntaxCharacter
:: one of ( )
[ ] { } /
- \ |
ClassSetReservedPunctuator
:: one of & -
! # % , :
; < = > @
` ~
Annex B (normative) Additional ECMAScript
Features for Web Browsers
The ECMAScript language syntax and semantics defined in this annex are required when the ECMAScript
host is a web browser. The content
of this annex is normative but optional if the ECMAScript host is not a web browser.
Note
This annex describes various legacy features and other characteristics of web browser ECMAScript
hosts . All of the language
features and behaviours specified in this annex have one or more undesirable characteristics and
in the absence of legacy usage would be removed from this specification. However, the usage of
these features by large numbers of existing web pages means that web browsers must continue to
support them. The specifications in this annex define the requirements for interoperable
implementations of these legacy features.
These features are not considered part of the core ECMAScript language. Programmers should not
use or assume the existence of these features and behaviours when writing new ECMAScript code.
ECMAScript implementations are discouraged from implementing these features unless the
implementation is part of a web browser or is required to run the same legacy ECMAScript code
that web browsers encounter.
B.1 Additional Syntax
B.1.2 Regular Expressions Patterns
The syntax of 22.2.1 is modified and extended as follows. These
changes introduce ambiguities that are broken by the ordering of grammar productions and by
contextual information. When parsing using the following grammar, each alternative is considered
only if previous production alternatives do not match.
This alternative pattern grammar and semantics only changes the syntax and semantics of BMP
patterns. The following grammar extensions include productions parameterized with the
[UnicodeMode] parameter. However, none of these extensions change the syntax of Unicode patterns
recognized when parsing with the [UnicodeMode] parameter present on the goal
symbol .
Syntax
Term [UnicodeMode,
UnicodeSetsMode, NamedCaptureGroups]
:: [+UnicodeMode]
Assertion [+UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
[+UnicodeMode]
Atom [+UnicodeMode, ?UnicodeSetsMode,
?NamedCaptureGroups]
Quantifier
[+UnicodeMode]
Atom [+UnicodeMode, ?UnicodeSetsMode,
?NamedCaptureGroups]
[~UnicodeMode]
QuantifiableAssertion [?NamedCaptureGroups]
Quantifier
[~UnicodeMode]
Assertion [~UnicodeMode,
~UnicodeSetsMode, ?NamedCaptureGroups]
[~UnicodeMode]
ExtendedAtom [?NamedCaptureGroups]
Quantifier
[~UnicodeMode]
ExtendedAtom [?NamedCaptureGroups]
Assertion [UnicodeMode,
UnicodeSetsMode, NamedCaptureGroups]
::
^
$
\b
\B
[+UnicodeMode]
(?=
Disjunction [+UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
[+UnicodeMode]
(?!
Disjunction [+UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
[~UnicodeMode]
QuantifiableAssertion [?NamedCaptureGroups]
(?<=
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?<!
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
QuantifiableAssertion [NamedCaptureGroups]
::
(?=
Disjunction [~UnicodeMode,
~UnicodeSetsMode, ?NamedCaptureGroups]
)
(?!
Disjunction [~UnicodeMode,
~UnicodeSetsMode, ?NamedCaptureGroups]
)
ExtendedAtom [NamedCaptureGroups]
::
.
\
AtomEscape [~UnicodeMode,
?NamedCaptureGroups]
\
[lookahead = c ]
CharacterClass [~UnicodeMode,
~UnicodeSetsMode]
(
GroupSpecifier [~UnicodeMode] opt
Disjunction [~UnicodeMode,
~UnicodeSetsMode, ?NamedCaptureGroups]
)
(?
RegularExpressionModifiers
:
Disjunction [~UnicodeMode,
~UnicodeSetsMode, ?NamedCaptureGroups]
)
(?
RegularExpressionModifiers
-
RegularExpressionModifiers
:
Disjunction [~UnicodeMode,
~UnicodeSetsMode, ?NamedCaptureGroups]
)
InvalidBracedQuantifier
ExtendedPatternCharacter
InvalidBracedQuantifier
::
{
DecimalDigits [~Sep]
}
{
DecimalDigits [~Sep]
,}
{
DecimalDigits [~Sep]
,
DecimalDigits [~Sep]
}
ExtendedPatternCharacter
::
SourceCharacter
but not one of ^
$
\
.
*
+
?
(
)
[
|
AtomEscape [UnicodeMode,
NamedCaptureGroups] ::
[+UnicodeMode]
DecimalEscape
[~UnicodeMode]
DecimalEscape
but only if the CapturingGroupNumber
of DecimalEscape
is ≤ CountLeftCapturingParensWithin (the
Pattern containing
DecimalEscape )
CharacterClassEscape [?UnicodeMode]
CharacterEscape [?UnicodeMode,
?NamedCaptureGroups]
[+NamedCaptureGroups]
k
GroupName [?UnicodeMode]
CharacterEscape [UnicodeMode,
NamedCaptureGroups] ::
ControlEscape
c
AsciiLetter
0
[lookahead ∉ DecimalDigit ]
HexEscapeSequence
RegExpUnicodeEscapeSequence [?UnicodeMode]
[~UnicodeMode]
LegacyOctalEscapeSequence
IdentityEscape [?UnicodeMode,
?NamedCaptureGroups]
IdentityEscape [UnicodeMode,
NamedCaptureGroups] ::
[+UnicodeMode]
SyntaxCharacter
[+UnicodeMode]
/
[~UnicodeMode]
SourceCharacterIdentityEscape [?NamedCaptureGroups]
SourceCharacterIdentityEscape [NamedCaptureGroups]
:: [~NamedCaptureGroups]
SourceCharacter
but not c
[+NamedCaptureGroups]
SourceCharacter
but not one of c or k
ClassAtomNoDash [UnicodeMode,
NamedCaptureGroups] ::
SourceCharacter
but not one of \ or ] or
-
\
ClassEscape [?UnicodeMode,
?NamedCaptureGroups]
\
[lookahead = c ]
ClassEscape [UnicodeMode,
NamedCaptureGroups] ::
b
[+UnicodeMode]
-
[~UnicodeMode]
c
ClassControlLetter
CharacterClassEscape [?UnicodeMode]
CharacterEscape [?UnicodeMode,
?NamedCaptureGroups]
ClassControlLetter
::
DecimalDigit
_
Note
When the same left-hand sides occurs with both [+UnicodeMode] and [~UnicodeMode] guards
it is to control the disambiguation priority.
B.1.2.1 Static Semantics: Early Errors
The semantics of 22.2.1.1 is
extended as follows:
ExtendedAtom
:: InvalidBracedQuantifier
It is a Syntax Error if any source text is matched by this production.
Additionally, the rules for the following productions are modified with the addition of the
highlighted text:
NonemptyClassRanges
::
ClassAtom
-
ClassAtom
ClassContents
NonemptyClassRangesNoDash
::
ClassAtomNoDash
-
ClassAtom
ClassContents
B.1.2.2 Static Semantics: CountLeftCapturingParensWithin and
CountLeftCapturingParensBefore
In the definitions of CountLeftCapturingParensWithin
and CountLeftCapturingParensBefore ,
references to “
Atom ::
(
GroupSpecifier opt
Disjunction
)
” are to be interpreted as meaning “
Atom ::
(
GroupSpecifier opt
Disjunction
)
” or “
ExtendedAtom
::
(
GroupSpecifier opt
Disjunction
)
”.
B.1.2.3 Static Semantics: IsCharacterClass
The semantics of 22.2.1.6 is
extended as follows:
ClassAtomNoDash
::
\
[lookahead = c ]
Return false .
B.1.2.4 Static Semantics: CharacterValue
The semantics of 22.2.1.7 is
extended as follows:
ClassAtomNoDash
::
\
[lookahead = c ]
Return the numeric value of U+005C (REVERSE SOLIDUS).
ClassEscape
::
c
ClassControlLetter
Let ch be the code point matched by ClassControlLetter .
Let i be the numeric value of ch .
Return the remainder of dividing i by 32.
CharacterEscape
:: LegacyOctalEscapeSequence
Return the MV of LegacyOctalEscapeSequence
(see 12.9.4.3 ).
B.1.2.5 Runtime Semantics: CompileSubpattern
The semantics of CompileSubpattern is extended as
follows:
The rule for
Term ::
QuantifiableAssertion
Quantifier
is the same as for
Term ::
Atom
Quantifier
but with QuantifiableAssertion
substituted for Atom .
The rule for
Term ::
ExtendedAtom
Quantifier
is the same as for
Term ::
Atom
Quantifier
but with ExtendedAtom substituted for Atom .
The rule for
Term :: ExtendedAtom
is the same as for
Term :: Atom
but with ExtendedAtom substituted for Atom .
B.1.2.6 Runtime Semantics: CompileAssertion
CompileAssertion rules for the
Assertion
::
(?=
Disjunction
)
and
Assertion
::
(?!
Disjunction
)
productions are also used for the QuantifiableAssertion
productions, but with QuantifiableAssertion
substituted for Assertion .
B.1.2.7 Runtime Semantics: CompileAtom
CompileAtom rules for the Atom productions except for
Atom :: PatternCharacter
are also used for the ExtendedAtom productions, but with
ExtendedAtom
substituted for Atom . The
following rules, with parameter direction , are also added:
ExtendedAtom
::
\
[lookahead = c ]
Let A be the CharSet containing the single
character \ U+005C (REVERSE SOLIDUS).
Return CharacterSetMatcher (rer ,
A , false , direction ).
ExtendedAtom
:: ExtendedPatternCharacter
Let ch be the character represented by ExtendedPatternCharacter .
Let A be a one-element CharSet containing the
character ch .
Return CharacterSetMatcher (rer ,
A , false , direction ).
B.1.2.8 Runtime Semantics: CompileToCharSet
The semantics of 22.2.2.9 is extended as follows:
The following two rules replace the corresponding rules of CompileToCharSet .
NonemptyClassRanges
::
ClassAtom
-
ClassAtom
ClassContents
Let A be CompileToCharSet of the first
ClassAtom with
argument rer .
Let B be CompileToCharSet of the second
ClassAtom with
argument rer .
Let C be CompileToCharSet of ClassContents with
argument rer .
Let D be CharacterRangeOrUnion (rer ,
A , B ).
Return the union of D and C .
NonemptyClassRangesNoDash
::
ClassAtomNoDash
-
ClassAtom
ClassContents
Let A be CompileToCharSet of ClassAtomNoDash with
argument rer .
Let B be CompileToCharSet of ClassAtom with argument
rer .
Let C be CompileToCharSet of ClassContents with
argument rer .
Let D be CharacterRangeOrUnion (rer ,
A , B ).
Return the union of D and C .
In addition, the following rules are added to CompileToCharSet .
ClassEscape
::
c
ClassControlLetter
Let cv be the CharacterValue
of this ClassEscape .
Let c be the character whose character value is cv .
Return the CharSet containing the single
character c .
ClassAtomNoDash
::
\
[lookahead = c ]
Return the CharSet containing the single
character \ U+005C (REVERSE SOLIDUS).
Note
This production can only be reached from the sequence
\c within a character class where it is not followed by an acceptable
control character.
B.1.2.8.1 CharacterRangeOrUnion ( rer ,
A , B )
The abstract operation CharacterRangeOrUnion takes arguments rer (a RegExp
Record ), A (a CharSet ), and B
(a CharSet ) and returns a CharSet . It performs the following steps
when called:
If HasEitherUnicodeFlag (rer )
is false , then
If A does not contain exactly one character or B
does not contain exactly one character, then
Let C be the CharSet
containing the single character - U+002D
(HYPHEN-MINUS).
Return the union of CharSets
A , B and C .
Return CharacterRange (A ,
B ).
B.1.2.9 Static Semantics: ParsePattern ( patternText ,
u , v )
The semantics of 22.2.3.4 is extended as follows:
The abstract operation ParsePattern takes arguments
patternText (a sequence of Unicode code points), u (a Boolean), and
v (a Boolean). It performs the following steps when called:
If v is true and u is
true , then
Let parseResult be a List
containing one or more SyntaxError objects.
Else if v is true , then
Let parseResult be ParseText (patternText ,
Pattern [+UnicodeMode,
+UnicodeSetsMode,
+NamedCaptureGroups] ).
Else if u is true , then
Let parseResult be ParseText (patternText ,
Pattern [+UnicodeMode,
~UnicodeSetsMode,
+NamedCaptureGroups] ).
Else,
Let parseResult be ParseText (patternText ,
Pattern [~UnicodeMode,
~UnicodeSetsMode,
~NamedCaptureGroups] ).
If parseResult is a Parse
Node and parseResult contains a GroupName , then
Set parseResult to ParseText (patternText ,
Pattern [~UnicodeMode,
~UnicodeSetsMode,
+NamedCaptureGroups] ).
Return parseResult .
B.2 Additional Built-in Properties
When the ECMAScript host is a
web browser the following additional properties of the standard built-in objects are defined.
B.2.1 Additional Properties of the Global Object
The entries in Table 102 are added
to Table 6 .
Table 102: Additional Well-known Intrinsic Objects
B.2.1.1 escape ( string )
This function is a property of the global object . It computes a new version of
a String value in which certain code units have been replaced by a hexadecimal escape
sequence.
When replacing a code unit of numeric value less than or equal to 0x00FF, a two-digit escape
sequence of the form %xx is used. When replacing a code unit of
numeric value strictly greater than 0x00FF, a four-digit escape sequence of the form
%uxxxx is used.
It is the %escape% intrinsic object.
It performs the following steps when called:
Set string to ? ToString (string ).
Let len be the length of string .
Let R be the empty String.
Let unescapedSet be the string-concatenation of
the ASCII word characters and
"@*+-./" .
Let k be 0.
Repeat, while k < len ,
Let C be the code unit at index k within
string .
If unescapedSet contains C , then
Let S be C .
Else,
Let n be the numeric value of C .
If n < 256, then
Let hex be the String representation of
n , formatted as an uppercase hexadecimal number.
Let S be the string-concatenation
of "%" and StringPad (hex ,
2, "0" , start ).
Else,
Let hex be the String representation of
n , formatted as an uppercase hexadecimal number.
Let S be the string-concatenation
of "%u" and StringPad (hex ,
4, "0" , start ).
Set R to the string-concatenation of
R and S .
Set k to k + 1.
Return R .
Note
The encoding is partly based on the encoding described in RFC 1738, but the entire
encoding specified in this standard is described above without regard to the
contents of RFC 1738. This encoding does not reflect changes to RFC 1738 made by RFC
3986.
B.2.1.2 unescape ( string )
This function is a property of the global object . It computes a new version of
a String value in which each escape sequence of the sort that might be introduced by the
escape function is replaced with the code unit that it represents.
It is the %unescape% intrinsic object.
It performs the following steps when called:
Set string to ? ToString (string ).
Let len be the length of string .
Let R be the empty String.
Let k be 0.
Repeat, while k < len ,
Let C be the code unit at index k within
string .
If C is the code unit 0x0025 (PERCENT SIGN), then
Let hexDigits be the empty String.
Let optionalAdvance be 0.
If k + 5 < len and the code unit at index
k + 1 within string is the code unit 0x0075
(LATIN SMALL LETTER U), then
Set hexDigits to the substring of
string from k + 2 to k + 6.
Set optionalAdvance to 5.
Else if k + 3 ≤ len , then
Set hexDigits to the substring of
string from k + 1 to k + 3.
Set optionalAdvance to 2.
Let parseResult be ParseText (hexDigits ,
HexDigits [~Sep] ).
If parseResult is a Parse Node ,
then
Let n be the MV of parseResult .
Set C to the code unit whose numeric value is
n .
Set k to k +
optionalAdvance .
Set R to the string-concatenation of
R and C .
Set k to k + 1.
Return R .
B.2.2 Additional Properties of the String.prototype Object
B.2.2.1 String.prototype.substr ( start ,
length )
This method returns a substring of the result of converting the
this value to a String, starting from index start and running
for length code units (or through the end of the String if length is
undefined ). If start is negative, it is treated as sourceLength + start where
sourceLength is the length of the String. The result is a String value,
not a String object.
It performs the following steps when called:
Let O be ? RequireObjectCoercible (this
value).
Let S be ? ToString (O ).
Let size be the length of S .
Let intStart be ? ToIntegerOrInfinity (start ).
If intStart = -∞, set intStart to 0.
Else if intStart < 0, set intStart to max (size +
intStart , 0).
Else, set intStart to min (intStart , size ).
If length is undefined , let intLength be
size ; otherwise let intLength be ? ToIntegerOrInfinity (length ).
Set intLength to the result of clamping intLength
between 0 and size .
Let intEnd be min (intStart +
intLength , size ).
Return the substring of S from
intStart to intEnd .
Note
This method is intentionally generic; it does not require that its
this value be a String object. Therefore it can be transferred to
other kinds of objects for use as a method.
B.2.2.2 String.prototype.anchor ( name )
This method performs the following steps when called:
Let S be the this value.
Return ? CreateHTML (S ,
"a" , "name" , name ).
B.2.2.2.1 CreateHTML ( string , tag ,
attribute , value )
The abstract operation CreateHTML takes arguments string (an ECMAScript language value ),
tag (a String), attribute (a String), and value (an
ECMAScript language value )
and returns either a normal
completion containing a String or a throw
completion . It performs the following steps when called:
Let str be ? RequireObjectCoercible (string ).
Let S be ? ToString (str ).
Let p1 be the string-concatenation of
"<" and tag .
If attribute is not the empty String, then
Let V be ? ToString (value ).
Let escapedV be the String value that is the same as
V except that each occurrence of the code unit 0x0022
(QUOTATION MARK) in V has been replaced with the six code
unit sequence """ .
Set p1 to the string-concatenation
of:
p1
the code unit 0x0020 (SPACE)
attribute
the code unit 0x003D (EQUALS SIGN)
the code unit 0x0022 (QUOTATION MARK)
escapedV
the code unit 0x0022 (QUOTATION MARK)
Let p2 be the string-concatenation of
p1 and ">" .
Let p3 be the string-concatenation of
p2 and S .
Let p4 be the string-concatenation of
p3 , "</" , tag , and
">" .
Return p4 .
B.2.2.3 String.prototype.big ( )
This method performs the following steps when called:
Let S be the this value.
Return ? CreateHTML (S ,
"big" , "" , "" ).
B.2.2.4 String.prototype.blink ( )
This method performs the following steps when called:
Let S be the this value.
Return ? CreateHTML (S ,
"blink" , "" , "" ).
B.2.2.5 String.prototype.bold ( )
This method performs the following steps when called:
Let S be the this value.
Return ? CreateHTML (S ,
"b" , "" , "" ).
B.2.2.6 String.prototype.fixed ( )
This method performs the following steps when called:
Let S be the this value.
Return ? CreateHTML (S ,
"tt" , "" , "" ).
B.2.2.7 String.prototype.fontcolor ( colour )
This method performs the following steps when called:
Let S be the this value.
Return ? CreateHTML (S ,
"font" , "color" , colour ).
B.2.2.8 String.prototype.fontsize ( size )
This method performs the following steps when called:
Let S be the this value.
Return ? CreateHTML (S ,
"font" , "size" , size ).
B.2.2.9 String.prototype.italics ( )
This method performs the following steps when called:
Let S be the this value.
Return ? CreateHTML (S ,
"i" , "" , "" ).
B.2.2.10 String.prototype.link ( url )
This method performs the following steps when called:
Let S be the this value.
Return ? CreateHTML (S ,
"a" , "href" , url ).
B.2.2.11 String.prototype.small ( )
This method performs the following steps when called:
Let S be the this value.
Return ? CreateHTML (S ,
"small" , "" , "" ).
B.2.2.12 String.prototype.strike ( )
This method performs the following steps when called:
Let S be the this value.
Return ? CreateHTML (S ,
"strike" , "" , "" ).
B.2.2.13 String.prototype.sub ( )
This method performs the following steps when called:
Let S be the this value.
Return ? CreateHTML (S ,
"sub" , "" , "" ).
B.2.2.14 String.prototype.sup ( )
This method performs the following steps when called:
Let S be the this value.
Return ? CreateHTML (S ,
"sup" , "" , "" ).
B.2.2.15 String.prototype.trimLeft ( )
Note
The property "trimStart" is preferred. The
"trimLeft" property is provided principally for compatibility
with old code. It is recommended that the "trimStart" property be
used in new ECMAScript code.
The initial value of the "trimLeft" property is
%String.prototype.trimStart%, defined in 22.1.3.34 .
B.2.2.16 String.prototype.trimRight ( )
Note
The property "trimEnd" is preferred. The
"trimRight" property is provided principally for compatibility
with old code. It is recommended that the "trimEnd" property be
used in new ECMAScript code.
The initial value of the "trimRight" property is
%String.prototype.trimEnd%, defined in 22.1.3.33 .
B.2.3 Additional Properties of the Date.prototype Object
B.2.3.1 Date.prototype.getYear ( )
Note
The getFullYear method is preferred for nearly all purposes, because it
avoids the “year 2000 problem.”
This method performs the following steps when called:
Let dateObject be the this value.
Perform ? RequireInternalSlot (dateObject ,
[[DateValue]] ).
Let t be dateObject .[[DateValue]] .
If t is NaN , return NaN .
Return YearFromTime (LocalTime (t )) -
1900 𝔽 .
B.2.3.2 Date.prototype.setYear ( year )
Note
The setFullYear method is preferred for nearly all purposes, because it
avoids the “year 2000 problem.”
This method performs the following steps when called:
Let dateObject be the this value.
Perform ? RequireInternalSlot (dateObject ,
[[DateValue]] ).
Let t be dateObject .[[DateValue]] .
Let y be ? ToNumber (year ).
If t is NaN , set t to
+0 𝔽 ; otherwise set t to LocalTime (t ).
Let yyyy be MakeFullYear (y ).
Let d be MakeDay (yyyy , MonthFromTime (t ),
DateFromTime (t )).
Let date be MakeDate (d , TimeWithinDay (t )).
Let u be TimeClip (UTC (date )).
Set dateObject .[[DateValue]] to u .
Return u .
B.2.3.3 Date.prototype.toGMTString ( )
Note
The toUTCString method is preferred. This method is provided principally
for compatibility with old code.
The initial value of the "toGMTString" property is
%Date.prototype.toUTCString%, defined in 21.4.4.43 .
B.2.4 Additional Properties of the RegExp.prototype Object
B.2.4.1 RegExp.prototype.compile ( pattern ,
flags )
This method performs the following steps when called:
Let O be the this value.
Perform ? RequireInternalSlot (O ,
[[RegExpMatcher]] ).
If pattern is an Object and pattern
has a [[RegExpMatcher]] internal slot, then
If flags is not undefined , throw a
TypeError exception.
Let P be pattern .[[OriginalSource]] .
Let F be pattern .[[OriginalFlags]] .
Else,
Let P be pattern .
Let F be flags .
Return ? RegExpInitialize (O ,
P , F ).
Note
This method completely reinitializes the this value RegExp with a
new pattern and flags. An implementation may interpret use of this method as an
assertion that the resulting RegExp object will be used multiple times and hence is
a candidate for extra optimization.
B.3 Other Additional Features
B.3.1 Labelled Function Declarations
Prior to ECMAScript 2015, the specification of LabelledStatement did not allow for the
association of a statement label with a FunctionDeclaration . However, a labelled
FunctionDeclaration was
an allowable extension for non-strict code and most browser-hosted
ECMAScript implementations supported that extension. In ECMAScript 2015 and later, the grammar
production for LabelledStatement permits use of FunctionDeclaration as a
LabelledItem but 14.13.1
includes an Early Error rule that produces a Syntax Error if that occurs. That rule is modified
with the addition of the highlighted text:
LabelledItem : FunctionDeclaration
It is a Syntax Error if any source text that is strict mode
code is matched by this production.
Note
B.3.2 Block-Level Function Declarations Web Legacy Compatibility
Semantics
Prior to ECMAScript 2015, the ECMAScript specification did not define the occurrence of a FunctionDeclaration as an
element of a Block statement's
StatementList . However,
support for that form of FunctionDeclaration was an allowable
extension and most browser-hosted ECMAScript implementations permitted them. Unfortunately, the
semantics of such declarations differ among those implementations. Because of these semantic
differences, existing web ECMAScript source text that uses Block level function declarations is only
portable among browser implementations if the usage only depends upon the semantic intersection
of all of the browser implementations for such declarations. The following are the use cases
that fall within that intersection semantics:
A function is declared and only referenced within a single block.
One or more FunctionDeclaration s whose
BindingIdentifier is the name
f occur within the function code of an enclosing function g
and that declaration is nested within a Block .
No other declaration of f that is not a var declaration
occurs within the function code of g .
All occurrences of f as an IdentifierReference are within
the StatementList
of the Block containing
the declaration of f .
A function is declared and possibly used within a single Block but also referenced by an inner function
definition that is not contained within that same Block .
One or more FunctionDeclaration s whose
BindingIdentifier is the name
f occur within the function code of an enclosing function g
and that declaration is nested within a Block .
No other declaration of f that is not a var declaration
occurs within the function code of g .
There may be occurrences of f as an IdentifierReference within the
StatementList of
the Block containing the
declaration of f .
There is at least one occurrence of f as an IdentifierReference within
another function h that is nested within g and no other
declaration of f shadows the references to f from within
h .
All invocations of h occur after the declaration of f has been
evaluated.
A function is declared and possibly used within a single block but also referenced within
subsequent blocks.
One or more FunctionDeclaration whose
BindingIdentifier is the name
f occur within the function code of an enclosing function g
and that declaration is nested within a Block .
No other declaration of f that is not a var declaration
occurs within the function code of g .
There may be occurrences of f as an IdentifierReference within the
StatementList of
the Block containing the
declaration of f .
There is at least one occurrence of f as an IdentifierReference within the
function code of g that lexically follows the Block containing the declaration of
f .
The first use case is interoperable with the semantics of Block level function declarations provided by ECMAScript
2015. Any pre-existing ECMAScript source text that employs that use case
will operate using the Block level function declarations semantics defined by clauses 10 , 14 , and
15 .
ECMAScript 2015 interoperability for the second and third use cases requires the following
extensions to the clause 10 ,
clause 15 , clause
19.2.1 and
clause 16.1.7 semantics.
If an ECMAScript implementation has a mechanism for reporting diagnostic warning messages, a
warning should be produced when code contains a FunctionDeclaration for which these
compatibility semantics are applied and introduce observable differences from non-compatibility
semantics. For example, if a var binding is not introduced because its introduction would create
an early
error , a warning message should not be produced.
B.3.2.1 Changes to FunctionDeclarationInstantiation
During FunctionDeclarationInstantiation
the following steps are performed in place of step 31 :
If strict is false , then
For each FunctionDeclaration
f that is directly contained in the StatementList of any Block , CaseClause , or
DefaultClause x
such that code Contains
x is true , do
Let F be the StringValue
of the BindingIdentifier
of f .
If replacing the FunctionDeclaration
f with a VariableStatement
that has F as a BindingIdentifier
would not produce any Early Errors for func and
parameterNames does not contain F , then
NOTE: A var binding for F is only instantiated
here if it is neither a VarDeclaredName, the name of a
formal parameter, or another FunctionDeclaration .
If instantiatedVarNames does not contain
F and F is not
"arguments" , then
Perform
! varEnv .CreateMutableBinding(F ,
false ).
Perform
! varEnv .InitializeBinding(F ,
undefined ).
Append F to
instantiatedVarNames .
When the FunctionDeclaration
f is evaluated, perform the following steps in
place of the FunctionDeclaration
Evaluation
algorithm provided in 15.2.6 :
Let fEnv be the running
execution context 's
VariableEnvironment.
Let bEnv be the running
execution context 's
LexicalEnvironment.
Let fObj be
! bEnv .GetBindingValue(F ,
false ).
Perform
! fEnv .SetMutableBinding(F ,
fObj , false ).
Return unused .
B.3.2.2 Changes to GlobalDeclarationInstantiation
During GlobalDeclarationInstantiation
the following steps are performed in place of step 12 :
Perform the following steps:
Let strict be ScriptIsStrict of
script .
If strict is false , then
Let declaredFunctionOrVarNames be the list-concatenation
of declaredFunctionNames and declaredVarNames .
For each FunctionDeclaration
f that is directly contained in the StatementList of any
Block ,
CaseClause , or DefaultClause
x such that script Contains
x is true , do
Let F be the StringValue
of the BindingIdentifier
of f .
If replacing the FunctionDeclaration
f with a VariableStatement
that has F as a BindingIdentifier
would not produce any Early Errors for script ,
then
If HasLexicalDeclaration (env ,
F ) is false , then
Let fnDefinable be
? CanDeclareGlobalVar (env ,
F ).
If fnDefinable is
true , then
NOTE: A var binding for F
is only instantiated here if it is
neither a VarDeclaredName nor the
name of another FunctionDeclaration .
If
declaredFunctionOrVarNames
does not contain F , then
Perform ? CreateGlobalVarBinding (env ,
F ,
false ).
Append F to
declaredFunctionOrVarNames .
When the FunctionDeclaration
f is evaluated, perform
the following steps in place of the
FunctionDeclaration
Evaluation
algorithm provided in 15.2.6 :
Let gEnv be the
running
execution
context 's
VariableEnvironment.
Let bEnv be the
running
execution
context 's
LexicalEnvironment.
Let fObj be
! bEnv .GetBindingValue(F ,
false ).
Perform ? gEnv .SetMutableBinding (F ,
fObj ,
false ).
Return
unused .
B.3.2.3 Changes to EvalDeclarationInstantiation
During EvalDeclarationInstantiation
the following steps are performed in place of step 13 :
If strict is false , then
Let declaredFunctionOrVarNames be the list-concatenation of
declaredFunctionNames and declaredVarNames .
For each FunctionDeclaration
f that is directly contained in the StatementList of any Block , CaseClause , or
DefaultClause x
such that body Contains
x is true , do
Let F be the StringValue
of the BindingIdentifier
of f .
If replacing the FunctionDeclaration
f with a VariableStatement
that has F as a BindingIdentifier
would not produce any Early Errors for body , then
Let bindingExists be false .
Let thisEnv be lexEnv .
Assert : The following
loop will terminate.
Repeat, while thisEnv is not varEnv ,
If thisEnv is not an
Object Environment
Record , then
If
! thisEnv .HasBinding(F )
is true , then
Let bindingExists be
true .
Set thisEnv to thisEnv .[[OuterEnv]] .
If bindingExists is false and
varEnv is a Global
Environment Record , then
If HasLexicalDeclaration (varEnv ,
F ) is false , then
Let fnDefinable be
? CanDeclareGlobalVar (varEnv ,
F ).
Else,
Let fnDefinable be
false .
Else,
Let fnDefinable be
true .
If bindingExists is false and
fnDefinable is true , then
If declaredFunctionOrVarNames does not
contain F , then
If varEnv is a Global
Environment Record ,
then
Perform ? CreateGlobalVarBinding (varEnv ,
F ,
true ).
Else,
Let bindingExists be
! varEnv .HasBinding(F ).
If bindingExists is
false , then
Perform
! varEnv .CreateMutableBinding(F ,
true ).
Perform
! varEnv .InitializeBinding(F ,
undefined ).
Append F to
declaredFunctionOrVarNames .
When the FunctionDeclaration
f is evaluated, perform the following
steps in place of the FunctionDeclaration
Evaluation
algorithm provided in 15.2.6 :
Let gEnv be the running
execution context 's
VariableEnvironment.
Let bEnv be the running
execution context 's
LexicalEnvironment.
Let fObj be
! bEnv .GetBindingValue(F ,
false ).
Perform ? gEnv .SetMutableBinding (F ,
fObj , false ).
Return unused .
B.3.2.4 Changes to Block Static Semantics: Early Errors
The rules for the following production in 14.2.1 are modified
with the addition of the highlighted text:
Block :
{
StatementList
}
B.3.2.5 Changes to switch Statement Static
Semantics: Early Errors
The rules for the following production in 14.12.1
are modified with the addition of the highlighted text:
SwitchStatement
:
switch
(
Expression
)
CaseBlock
B.3.2.6 Changes to BlockDeclarationInstantiation
During BlockDeclarationInstantiation
the following steps are performed in place of step 3.a.ii.1 :
If ! env .HasBinding(dn ) is false , then
Perform ! env .CreateMutableBinding(dn ,
false ).
During BlockDeclarationInstantiation
the following steps are performed in place of step 3.b.iii :
Perform the following steps:
If the binding for fn in env is an uninitialized
binding, then
Perform ! env .InitializeBinding(fn ,
fo ).
Else,
Assert : d is a
FunctionDeclaration .
Perform ! env .SetMutableBinding(fn ,
fo , false ).
B.3.3 FunctionDeclarations in IfStatement Statement Clauses
The following augments the IfStatement production in 14.6 :
IfStatement [Yield, Await,
Return] :
if
(
Expression [+In, ?Yield,
?Await]
)
FunctionDeclaration [?Yield,
?Await, ~Default]
else
Statement [?Yield, ?Await,
?Return]
if
(
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
else
FunctionDeclaration [?Yield,
?Await, ~Default]
if
(
Expression [+In, ?Yield,
?Await]
)
FunctionDeclaration [?Yield,
?Await, ~Default]
else
FunctionDeclaration [?Yield,
?Await, ~Default]
if
(
Expression [+In, ?Yield,
?Await]
)
FunctionDeclaration [?Yield,
?Await, ~Default]
[lookahead ≠ else ]
This production only applies when parsing non-strict code . Source text matched
by this production is processed as if each matching occurrence of FunctionDeclaration [?Yield,
?Await, ~Default] was the sole StatementListItem of a
BlockStatement occupying
that position in the source text. The semantics of such a synthetic BlockStatement includes the web legacy
compatibility semantics specified in B.3.2 .
B.3.4 VariableStatements in Catch Blocks
The content of subclause 14.15.1 is
replaced with the following:
Catch :
catch
(
CatchParameter
)
Block
Note
The Block of a Catch clause may contain
var declarations that bind a name that is also bound by the CatchParameter . At
runtime, such bindings are instantiated in the VariableDeclarationEnvironment. They do
not shadow the same-named bindings introduced by the CatchParameter and hence the Initializer for such
var declarations will assign to the corresponding catch parameter rather
than the var binding.
This modified behaviour also applies to var and function declarations
introduced by direct
eval calls contained within the Block of a Catch clause. This change is accomplished by modifying
the algorithm of 19.2.1.3 as follows:
Step 3.d.i.2.a.i
is replaced by:
If thisEnv is not the Environment Record
for a Catch clause, throw a
SyntaxError exception.
Step 13.b.ii.4.a.i.i
is replaced by:
If thisEnv is not the Environment Record
for a Catch clause, let
bindingExists be true .
B.3.5 Initializers in ForIn Statement Heads
The following augments the ForInOfStatement production in
14.7.5 :
ForInOfStatement [Yield,
Await, Return] :
for
(
var
BindingIdentifier [?Yield,
?Await]
Initializer [~In, ?Yield,
?Await]
in
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
This production only applies when parsing non-strict code .
The static semantics of ContainsDuplicateLabels
in 8.3.1 are augmented
with the following:
ForInOfStatement
:
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
Return ContainsDuplicateLabels
of Statement with
argument labelSet .
The static semantics of ContainsUndefinedBreakTarget
in 8.3.2 are
augmented with the following:
ForInOfStatement
:
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
Return ContainsUndefinedBreakTarget
of Statement with
argument labelSet .
The static semantics of ContainsUndefinedContinueTarget
in 8.3.3 are
augmented with the following:
ForInOfStatement
:
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
Return ContainsUndefinedContinueTarget
of Statement with
arguments iterationSet and « ».
The static semantics of IsDestructuring in 14.7.5.2 are augmented with
the following:
BindingIdentifier
:
Identifier
yield
await
Return false .
The static semantics of VarDeclaredNames in
8.2.6 are augmented with
the following:
ForInOfStatement
:
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
Let names1 be the BoundNames of BindingIdentifier .
Let names2 be the VarDeclaredNames of
Statement .
Return the list-concatenation of
names1 and names2 .
The static semantics of VarScopedDeclarations
in 8.2.7 are augmented
with the following:
ForInOfStatement
:
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
Let declarations1 be « BindingIdentifier ».
Let declarations2 be the VarScopedDeclarations
of Statement .
Return the list-concatenation of
declarations1 and declarations2 .
The runtime semantics of ForInOfLoopEvaluation
in 14.7.5.5 are
augmented with the following:
ForInOfStatement
:
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
Let bindingId be the StringValue of BindingIdentifier .
Let lhs be ? ResolveBinding (bindingId ).
If IsAnonymousFunctionDefinition (Initializer ) is
true , then
Let value be ? NamedEvaluation of Initializer with
argument bindingId .
Else,
Let rhs be ? Evaluation of
Initializer .
Let value be ? GetValue (rhs ).
Perform ? PutValue (lhs , value ).
Let keyResult be ? ForIn/OfHeadEvaluation (« », Expression ,
enumerate ).
Return ? ForIn/OfBodyEvaluation (BindingIdentifier ,
Statement ,
keyResult , enumerate ,
var-binding , labelSet ).
B.3.6 The [[IsHTMLDDA]] Internal Slot
An [[IsHTMLDDA]] internal slot may exist on
host-defined objects. Objects with an [[IsHTMLDDA]] internal slot behave like undefined in
the ToBoolean and IsLooselyEqual abstract operations
and when used as an operand for the typeof operator .
Note
Objects with an [[IsHTMLDDA]] internal slot are never created by
this specification. However, the document.all
object in web browsers is a host-defined exotic object with this slot
that exists for web compatibility purposes. There are no other known examples of this
type of object and implementations should not create any with the exception of
document.all.
B.3.6.1 Changes to ToBoolean
The following step replaces step 3 of
ToBoolean :
If argument is an Object and argument
has an [[IsHTMLDDA]] internal slot, return
false .
B.3.6.2 Changes to IsLooselyEqual
The following steps replace step 4
of IsLooselyEqual :
Perform the following steps:
If x is an Object , x
has an [[IsHTMLDDA]] internal slot, and
y is either undefined or
null , return true .
If x is either undefined or
null , y is an Object ,
and y has an [[IsHTMLDDA]] internal
slot, return true .
B.3.6.3 Changes to the typeof Operator
The following step replaces step 12 of
the evaluation semantics
for typeof :
If val has an [[IsHTMLDDA]] internal slot,
return "undefined" .
B.3.7 Non-default behaviour in HostMakeJobCallback
The HostMakeJobCallback abstract operation
allows hosts which are web
browsers to specify non-default behaviour.
B.3.8 Non-default behaviour in HostEnsureCanAddPrivateElement
The HostEnsureCanAddPrivateElement
abstract operation allows hosts which are web browsers to specify non-default
behaviour.
B.3.9 Runtime Errors for Function Call Assignment Targets
When a function call (13.3.6 ) is used as an assignment target in
non-strict
code , instead of producing an early error , a
ReferenceError exception is thrown during evaluation of the assignment.
Note
When the assignment target is the LeftHandSideExpression of an
AssignmentExpression , the
assignment operator must be = or an AssignmentOperator ; in particular,
the allowance here does not apply to the logical assignment operators (??=,
&&=, ||=).
See step 1 of AssignmentTargetType
for
CallExpression :
CoverCallExpressionAndAsyncArrowHead
and
CallExpression :
CallExpression
Arguments
.
Annex C (informative) The Strict Mode of
ECMAScript
The strict mode restriction and exceptions
implements, interface, let, package,
private, protected, public, static, and
yield are reserved words within strict mode
code . (12.7.2 ).
A conforming implementation, when processing strict mode code , must disallow
instances of the productions
NumericLiteral ::
LegacyOctalIntegerLiteral
and
DecimalIntegerLiteral
:: NonOctalDecimalIntegerLiteral
.
A conforming implementation, when processing strict mode code , must disallow
instances of the productions
EscapeSequence ::
LegacyOctalEscapeSequence
and
EscapeSequence ::
NonOctalDecimalEscapeSequence
.
Assignment to an undeclared identifier or otherwise unresolvable reference does not create a
property in the global object . When a simple assignment occurs
within strict
mode code , its LeftHandSideExpression must not evaluate to
an unresolvable Reference. If it does a ReferenceError exception is thrown
(6.2.5.6 ). The
LeftHandSideExpression
also may not be a reference to a data property with the attribute value { [[Writable]] : false }, to an accessor
property with the attribute value { [[Set]] :
undefined }, nor to a non-existent property of an object whose [[Extensible]] internal slot is false . In these cases a
TypeError exception is thrown (13.15 ).
An IdentifierReference with
the StringValue
"eval" or "arguments" may not appear as the LeftHandSideExpression of an
Assignment operator (13.15 ) or of an UpdateExpression (13.4 ) or as the UnaryExpression operated upon by a Prefix
Increment (13.4.4 ) or a Prefix Decrement
(13.4.5 ) operator.
Arguments objects for strict functions define a non-configurable accessor
property "callee" which throws a
TypeError exception on access (10.4.4.6 ).
Arguments objects for strict functions do not dynamically share their
array-indexed
property values with the corresponding formal parameter bindings of their functions. (10.4.4 ).
For strict
functions , if an arguments object is created the binding of the local
identifier arguments to the arguments object is immutable and hence may not be the
target of an assignment expression. (10.2.11 ).
It is a SyntaxError if the StringValue of a BindingIdentifier is either
"eval" or "arguments" within strict mode
code (13.1.1 ).
Strict mode eval code cannot instantiate variables or functions in the variable environment of the
caller to eval. Instead, a new variable environment is created and that environment is used for
declaration binding instantiation for the eval code (19.2.1 ).
If this is evaluated within strict mode code , then the
this value is not coerced to an object. A this value of either
undefined or null is not converted to the global
object and primitive values are not converted to wrapper objects. The
this value passed via a function call (including calls made using
Function.prototype.apply and Function.prototype.call) do not coerce the
passed this value to an object (10.2.1.2 , 20.2.3.1 , 20.2.3.3 ).
When a delete operator occurs within strict mode code , a
SyntaxError is thrown if its UnaryExpression is a direct reference to a
variable, function argument, or function name (13.5.1.1 ).
When a delete operator occurs within strict mode code , a
TypeError is thrown if the property to be deleted has the attribute { [[Configurable]] : false } or otherwise cannot be deleted
(13.5.1.2 ).
Strict mode
code may not include a WithStatement . The occurrence of a WithStatement in such a context is a
SyntaxError (14.11.1 ).
It is a SyntaxError if a CatchParameter occurs within strict mode
code and the BoundNames of CatchParameter contains either
eval or arguments (14.15.1 ).
It is a SyntaxError if the same BindingIdentifier appears more than once in the
FormalParameters of a
strict
function . An attempt to create such a function using a Function, Generator,
or AsyncFunction constructor is a SyntaxError
(15.2.1 ,
20.2.1.1.1 ).
An implementation may not extend, beyond that defined in this specification, the meanings within
strict
functions of properties named "caller" or
"arguments" of function instances.
Annex D (informative) Host Layering Points
See 4.2 for the definition of host .
D.1 Host Hooks
HostCallJobCallback (...)
HostEnqueueFinalizationRegistryCleanupJob (...)
HostEnqueueGenericJob (...)
HostEnqueuePromiseJob (...)
HostEnqueueTimeoutJob (...)
HostEnsureCanCompileStrings (...)
HostFinalizeImportMeta (...)
HostGetImportMetaProperties (...)
HostGrowSharedArrayBuffer (...)
HostHasSourceTextAvailable (...)
HostLoadImportedModule (...)
HostGetSupportedImportAttributes (...)
HostMakeJobCallback (...)
HostPromiseRejectionTracker (...)
HostResizeArrayBuffer (...)
InitializeHostDefinedRealm (...)
D.2 Host-defined Fields
[[HostDefined]] on Realm Records : See Table
24 .
[[HostDefined]] on Script Records : See Table
39 .
[[HostDefined]] on Module Records : See
Table 43 .
[[HostDefined]] on JobCallback Records : See
Table
28 .
[[HostSynchronizesWith]] on Candidate Executions: See Table 101 .
[[IsHTMLDDA]] : See B.3.6 .
D.3 Host-defined Objects
The global
object : See clause 19 .
D.4 Running Jobs
Preparation steps before, and cleanup steps after, invocation of Job Abstract Closures . See 9.5 .
D.5 Internal Methods of Exotic Objects
Any of the essential internal methods in Table 4 for any
exotic
object not specified within this specification.
D.6 Built-in Objects and Methods
Any built-in objects and methods not defined within this specification, except as restricted in
17.1 .
Annex E (informative) Corrections and
Clarifications in ECMAScript 2015 with Possible Compatibility Impact
9.1.1.4.14 -9.1.1.4.17 Edition 5 and 5.1 used a
property existence test to determine whether a global object property corresponding to a new global
declaration already existed. ECMAScript 2015 uses an own property existence test. This corresponds to
what has been most commonly implemented by web browsers.
10.4.2.1 : The
5th Edition moved the capture of the current array length prior to the integer conversion of the
array index or new
length value. However, the captured length value could become invalid if the conversion process has the
side-effect of changing the array length. ECMAScript 2015 specifies that the current array length must
be captured after the possible occurrence of such side-effects.
21.4.1.31 : Previous
editions permitted the TimeClip abstract operation to return either
+0 𝔽 or -0 𝔽 as the representation of a 0
time value . ECMAScript 2015 specifies that
+0 𝔽 always returned. This means that for ECMAScript 2015 the time value of a Date is never observably
-0 𝔽 and methods that return time values never return
-0 𝔽 .
21.4.1.32 : If a UTC offset representation is
not present, the local time zone is used. Edition 5.1 incorrectly stated that a missing time zone should
be interpreted as "z" .
21.4.4.36 : If the year cannot be
represented using the Date Time String Format specified in 21.4.1.32 a RangeError exception
is thrown. Previous editions did not specify the behaviour for that case.
21.4.4.41 : Previous editions did not specify
the value returned by Date.prototype.toString when the time value is NaN .
ECMAScript 2015 specifies the result to be the String value "Invalid Date" .
22.2.4.1 , 22.2.6.13.1 : Any LineTerminator code points in
the value of the "source" property of a RegExp instance must be expressed using an
escape sequence. Edition 5.1 only required the escaping of /.
22.2.6.8 , 22.2.6.11 : In previous editions,
the specifications for String.prototype.match and String.prototype.replace was
incorrect for cases where the pattern argument was a RegExp value whose global flag is set.
The previous specifications stated that for each attempt to match the pattern, if lastIndex
did not change, it should be incremented by 1. The correct behaviour is that lastIndex
should be incremented by 1 only if the pattern matched the empty String.
23.1.3.30 : Previous editions did not specify how
a NaN value returned by a comparator was interpreted by
Array.prototype.sort. ECMAScript 2015 specifies that such as value is treated as if
+0 𝔽 was returned from the comparator . ECMAScript 2015 also
specifies that ToNumber
is applied to the result returned by a comparator . In previous editions, the effect of a
comparator result that is not a Number
value was implementation-defined . In practice,
implementations call ToNumber .
Annex F (informative) Additions and Changes
That Introduce Incompatibilities with Prior Editions
6.2.5 : In ECMAScript 2015,
Function calls are not allowed to return a Reference Record .
7.1.4.1 : In ECMAScript 2015,
ToNumber applied to a
String value now recognizes and converts BinaryIntegerLiteral and OctalIntegerLiteral numeric
strings. In previous editions such strings were converted to NaN .
9.3 : In
ECMAScript 2018, Template objects are canonicalized based on Parse Node (source location),
instead of across all occurrences of that template literal or tagged template in a Realm in previous editions.
12.2 : In
ECMAScript 2016, Unicode 8.0.0 or higher is mandated, as opposed to ECMAScript 2015 which mandated
Unicode 5.1. In particular, this caused U+180E MONGOLIAN VOWEL SEPARATOR, which was in the
Space_Separator (Zs) category and thus treated as whitespace in ECMAScript
2015, to be moved to the Format (Cf) category (as of Unicode 6.3.0). This
causes whitespace-sensitive methods to behave differently. For example,
"\u180E".trim().length was 0 in previous editions, but 1 in
ECMAScript 2016 and later. Additionally, ECMAScript 2017 mandated always using the latest version of the
Unicode Standard.
12.7 : In ECMAScript 2015, the valid code points
for an IdentifierName are specified
in terms of the Unicode properties “ID_Start” and “ID_Continue”. In previous editions, the valid IdentifierName or Identifier code points were specified by
enumerating various Unicode code point categories.
12.10.1 : In ECMAScript 2015,
Automatic Semicolon Insertion adds a semicolon at the end of a do-while statement if the semicolon is
missing. This change aligns the specification with the actual behaviour of most existing
implementations.
13.2.5.1 : In
ECMAScript 2015, it is no longer an early error to have duplicate property names in Object
Initializers.
13.15.1 : In
ECMAScript 2015, strict mode code containing an assignment to an
immutable binding such as the function name of a FunctionExpression does not produce an early error . Instead it
produces a runtime error.
14.2 : In ECMAScript 2015, a
StatementList beginning with the
token let followed by the input elements LineTerminator then Identifier is the start of a LexicalDeclaration . In previous editions, automatic
semicolon insertion would always insert a semicolon before the Identifier input element.
14.5 : In ECMAScript 2015, a StatementListItem beginning with the
token let followed by the token [ is the start of a LexicalDeclaration . In previous editions such a
sequence would be the start of an ExpressionStatement .
14.6.2 : In ECMAScript 2015,
the normal result of an IfStatement is
never the value empty . If no Statement part is evaluated or if the evaluated Statement part produces a normal completion containing
empty , the result of the IfStatement is undefined .
14.7 : In ECMAScript 2015, if the (
token of a for statement is immediately followed by the token sequence let [ then the
let is treated as the start of a LexicalDeclaration . In previous editions such a
token sequence would be the start of an Expression .
14.7 : In ECMAScript 2015, if the ( token of a
for-in statement is immediately followed by the token sequence let [ then the
let is treated as the start of a ForDeclaration . In previous editions such a token
sequence would be the start of an LeftHandSideExpression .
14.7 : Prior to ECMAScript 2015, an
initialization expression could appear as part of the VariableDeclaration that precedes the
in keyword . In ECMAScript 2015, the ForBinding in that same position does not
allow the occurrence of such an initializer. In ECMAScript 2017, such an initializer is permitted only
in non-strict
code .
14.7 : In ECMAScript 2015, the result of
evaluating an IterationStatement
is never a normal completion whose [[Value]] is empty . If the Statement part of an IterationStatement is not evaluated or if the final
evaluation of the Statement part produces
a normal completion whose [[Value]] is empty , the result of evaluating the IterationStatement is a normal completion whose [[Value]] is undefined .
14.11.2 : In ECMAScript
2015, the result of evaluating a WithStatement is never a normal completion whose [[Value]] is empty . If evaluation of the Statement part of a WithStatement produces a normal completion whose [[Value]] is empty , the result of evaluating the WithStatement is a normal completion whose [[Value]] is undefined .
14.12.4 : In ECMAScript
2015, the result of evaluating a SwitchStatement is never a normal completion whose [[Value]] is empty . If evaluation of the CaseBlock part of a SwitchStatement produces a normal completion whose [[Value]] is empty , the result of evaluating the SwitchStatement is a normal completion whose [[Value]] is undefined .
14.15 : In
ECMAScript 2015, it is an early
error for a Catch
clause to contain a var declaration for the same Identifier that appears as the Catch clause parameter. In previous editions, such a variable
declaration would be instantiated in the enclosing variable environment but the declaration's Initializer value would be assigned to the
Catch parameter.
14.15 ,
19.2.1.3 : In ECMAScript 2015, a runtime
SyntaxError is thrown if a Catch clause evaluates a non-strict direct eval
whose eval code includes a var or FunctionDeclaration declaration that binds
the same Identifier that appears as the
Catch clause parameter.
14.15.3 : In ECMAScript
2015, the result of a TryStatement is
never the value empty . If the Block part of a TryStatement evaluates to a normal completion containing
empty , the result of the TryStatement is undefined . If the
Block part of a TryStatement evaluates to a throw completion and it has a
Catch part that evaluates to a normal completion containing
empty , the result of the TryStatement is undefined if there is
no Finally clause or if its Finally clause evaluates to an
empty normal
completion .
15.4.5 In ECMAScript
2015, the function
objects that are created as the values of the [[Get]] or
[[Set]] attribute of accessor properties in an ObjectLiteral are not constructor functions and they do not have a
"prototype" own property. In the previous edition, they were constructors and had a
"prototype" property.
20.1.2.6 :
In ECMAScript 2015, if the argument to Object.freeze is not an object it is treated as if
it was a non-extensible ordinary object with no own properties. In the previous
edition, a non-object argument always causes a TypeError to be thrown.
20.1.2.8 : In ECMAScript 2015, if the
argument to Object.getOwnPropertyDescriptor is not an object an attempt is made to coerce
the argument using ToObject . If the coercion is successful the result is used
in place of the original argument value. In the previous edition, a non-object argument always causes a
TypeError to be thrown.
20.1.2.10 : In ECMAScript 2015, if the
argument to Object.getOwnPropertyNames is not an object an attempt is made to coerce the
argument using ToObject . If the coercion is successful the result is used
in place of the original argument value. In the previous edition, a non-object argument always causes a
TypeError to be thrown.
20.1.2.12 : In ECMAScript 2015, if the argument
to Object.getPrototypeOf is not an object an attempt is made to coerce the argument using
ToObject . If the
coercion is successful the result is used in place of the original argument value. In the previous
edition, a non-object argument always causes a TypeError to be thrown.
20.1.2.16 : In ECMAScript 2015, if the argument to
Object.isExtensible is not an object it is treated as if it was a non-extensible ordinary object
with no own properties. In the previous edition, a non-object argument always causes a
TypeError to be thrown.
20.1.2.17 : In ECMAScript 2015, if the argument to
Object.isFrozen is not an object it is treated as if it was a non-extensible ordinary object
with no own properties. In the previous edition, a non-object argument always causes a
TypeError to be thrown.
20.1.2.18 : In ECMAScript 2015, if the argument to
Object.isSealed is not an object it is treated as if it was a non-extensible ordinary object
with no own properties. In the previous edition, a non-object argument always causes a
TypeError to be thrown.
20.1.2.19 : In
ECMAScript 2015, if the argument to Object.keys is not an object an attempt is made to
coerce the argument using ToObject . If the coercion is successful the result is used
in place of the original argument value. In the previous edition, a non-object argument always causes a
TypeError to be thrown.
20.1.2.20 : In ECMAScript 2015, if the
argument to Object.preventExtensions is not an object it is treated as if it was a
non-extensible ordinary
object with no own properties. In the previous edition, a non-object argument
always causes a TypeError to be thrown.
20.1.2.22 : In
ECMAScript 2015, if the argument to Object.seal is not an object it is treated as if it was
a non-extensible ordinary
object with no own properties. In the previous edition, a non-object argument
always causes a TypeError to be thrown.
20.2.3.2 : In ECMAScript 2015, the [[Prototype]] internal slot of a bound function is set to the [[GetPrototypeOf]] value of its target function. In the previous edition, [[Prototype]] was always set to %Function.prototype% .
20.2.4.1 : In ECMAScript 2015, the
"length" property of function instances is configurable. In previous editions it was
non-configurable.
20.5.6.2 : In ECMAScript
2015, the [[Prototype]] internal slot of a NativeError constructor is the Error
constructor . In
previous editions it was the Function prototype
object .
21.4.4 In ECMAScript 2015,
the Date prototype object is not
a Date instance. In previous editions it was a Date instance whose TimeValue was NaN .
22.1.3.12 In ECMAScript 2015, the
String.prototype.localeCompare function must treat Strings that are canonically equivalent
according to the Unicode Standard as being identical. In previous editions implementations were
permitted to ignore canonical equivalence and could instead use a bit-wise comparison.
22.1.3.28 and 22.1.3.30 In ECMAScript 2015,
lowercase/upper conversion processing operates on code points. In previous editions such the conversion
processing was only applied to individual code units. The only affected code points are those in the
Deseret block of Unicode.
22.1.3.32 In ECMAScript 2015, the
String.prototype.trim method is defined to recognize white space code points that may exist
outside of the Unicode BMP. However, as of Unicode 7 no such code points are defined. In previous
editions such code points would not have been recognized as white space.
22.2.4.1 In ECMAScript 2015, If the
pattern argument is a RegExp instance and the flags argument is not
undefined , a new RegExp instance is created just like pattern except that
pattern 's flags are replaced by the argument flags . In previous editions a
TypeError exception was thrown when pattern was a RegExp instance and
flags was not undefined .
22.2.6 In ECMAScript 2015,
the RegExp prototype object is
not a RegExp instance. In previous editions it was a RegExp instance whose pattern is the empty String.
22.2.6 In ECMAScript 2015,
"source" , "global" , "ignoreCase" , and
"multiline" are accessor properties defined on the RegExp prototype object . In
previous editions they were data properties defined on RegExp instances.
25.4.15 :
In ECMAScript 2019, Atomics.wake has been renamed to Atomics.notify to prevent
confusion with Atomics.wait.
27.1.6.4 , 27.6.3.6 : In ECMAScript 2019, the number of
Jobs enqueued by await
was reduced, which could create an observable difference in resolution order between a
then() call and an await expression.
Bibliography
IEEE 754-2019 : IEEE Standard for Floating-Point Arithmetic .
Institute of Electrical and Electronic Engineers, New York (2019)
Note
There are no normative changes between IEEE 754-2008 and IEEE 754-2019 that affect the
ECMA-262 specification.
The Unicode Standard , available at <https://unicode.org/versions/latest >
Unicode Technical Note #5: Canonical Equivalence in Applications , available at <https://unicode.org/notes/tn5/ >
Unicode Technical Standard #10: Unicode Collation Algorithm , available at <https://unicode.org/reports/tr10/ >
Unicode Standard Annex #15, Unicode Normalization Forms , available at <https://unicode.org/reports/tr15/ >
Unicode Standard Annex #18: Unicode Regular Expressions , available at <https://unicode.org/reports/tr18/ >
Unicode Standard Annex #24: Unicode Script Property , available at <https://unicode.org/reports/tr24/ >
Unicode Standard Annex #31, Unicode Identifiers and Pattern Syntax , available at <https://unicode.org/reports/tr31/ >
Unicode Standard Annex #44: Unicode Character Database , available at <https://unicode.org/reports/tr44/ >
Unicode Technical Standard #51: Unicode Emoji , available at <https://unicode.org/reports/tr51/ >
IANA Time Zone Database , available at <https://www.iana.org/time-zones >
ISO 8601:2004(E) Data elements and interchange formats — Information interchange — Representation
of dates and times
RFC 1738 “Uniform Resource Locators (URL)” , available at <https://tools.ietf.org/html/rfc1738 >
RFC 2396 “Uniform Resource Identifiers (URI): Generic Syntax” , available at <https://tools.ietf.org/html/rfc2396 >
RFC 3629 “UTF-8, a transformation format of ISO 10646” , available at <https://tools.ietf.org/html/rfc3629 >
RFC 7231 “Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content” , available at <https://tools.ietf.org/html/rfc7231 >
Colophon
This specification is authored on GitHub in a plaintext
source format called Ecmarkup . Ecmarkup is an HTML
and Markdown dialect that provides a framework and toolset for authoring ECMAScript specifications in
plaintext and processing the specification into a full-featured HTML rendering that follows the
editorial conventions for this document. Ecmarkup builds on and integrates a number of other formats and
technologies including Grammarkdown for defining
syntax and Ecmarkdown for authoring algorithm steps.
PDF renderings of this specification are produced using a print stylesheet which takes advantage of the
CSS Paged Media specification and is converted using PrinceXML .
Prior editions of this specification were authored using Word—the Ecmarkup source text that formed the
basis of this edition was produced by converting the ECMAScript 2015 Word document to Ecmarkup using an
automated conversion tool.
Copyright & Software License
Ecma International
Rue du Rhone 114
CH-1204 Geneva
Tel: +41 22 849 6000
Fax: +41 22 849 6001
Web: https://ecma-international.org/
Copyright Notice
© 2025 Ecma International
This draft document may be copied and furnished to others, and derivative works that comment on or
otherwise explain it or assist in its implementation may be prepared, copied, published, and
distributed, in whole or in part, without restriction of any kind, provided that the above copyright
notice and this section are included on all such copies and derivative works. However, this document
itself may not be modified in any way, including by removing the copyright notice or references to
Ecma International, except as needed for the purpose of developing any document or deliverable
produced by Ecma International.
This disclaimer is valid only prior to final version of this document. After approval all rights on
the standard are reserved by Ecma International.
The limited permissions are granted through the standardization phase and will not be revoked by Ecma
International or its successors or assigns during this time.
This document and the information contained herein is provided on an "AS IS" basis and ECMA
INTERNATIONAL DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY
WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY
IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
Software License
All Software contained in this document ("Software") is protected by copyright and is being made
available under the "BSD License", included below. This Software may be subject to third party rights
(rights from parties other than Ecma International), including patent rights, and no licenses under such
third party rights are granted under this license even if the third party concerned is a member of Ecma
International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS AVAILABLE AT https://ecma-international.org/memento/codeofconduct.htm
FOR INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO IMPLEMENT ECMA
INTERNATIONAL STANDARDS.
Redistribution and use in source and binary forms, with or without modification, are permitted provided
that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of conditions and
the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions
and the following disclaimer in the documentation and/or other materials provided with the
distribution.
Neither the name of the authors nor Ecma International may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.